2010-06-30 79 views
0

我试图根据它是否存在于两个联接表中来更新我的表中的一个字段。2个内部联接的MYSQL更新挂起

update quotes 
inner join collection_records ON quotes.id <> collection_records.record_id 
inner join subcollection_records ON quotes.id <> subcollection_records.record_id 
set quotes.status_id = 1 
where collection_records.type = 'Quote' 
    or subcollection_records.type = 'Quote' 

此查询运行,但挂起。如果我删除内部连接它的工作原理,但我需要检查两个连接表的存在的报价编号。

+0

左边的加入会成为这里的路吗? – Paul 2010-06-30 18:25:31

+1

您正在进行大量的交叉连接,将所有可能的集合和子集合行的组合*连接起来,除了* ID匹配的地方。如果这个声明能够运行,它几乎肯定会更新每一个报价。这不是检查可连接行不存在的方法......在Ponies的答案中使用null-join方法。 – bobince 2010-06-30 18:33:51

回答

0

我的猜测是,这主要是由于<>(不等于)运算符。这真的是你在这里找的东西吗?

2

必须小心,因为使用JOIN会为独特的支持数据带来重复数据的风险。我重新写你的查询为:

UPDATE QUOTES 
    SET status_id = 1 
WHERE id NOT IN (SELECT cr.record_id 
        FROM COLLECTION_RECORDS cr 
        WHERE cr.type = 'Quote') 
    AND id NOT IN (SELECT sr.record_id 
        FROM SUBCOLLECTION_RECORDS sr 
        WHERE sr.type = 'Quote') 

使用LEFT JOIN/IS NULL:

UPDATE QUOTES 
LEFT JOIN COLLECTION_RECORDS cr ON cr.record_id = id 
           AND cr.type = 'Quote' 
LEFT JOIN SUBCOLLECTION_RECORDS sr ON sr.record_id = id 
            AND sr.type = 'Quote' 
    SET status_id = 1 
WHERE cr.record_id IS NULL 
    AND sr.record_id IS NULL 
+0

OMG小马我认为上面的查询应该可以做到。非常感谢! – Paul 2010-07-01 17:16:59

0

另外,如果你有两个joinging表报价记录....你会得到2记录回来。看起来,加入其中一个连接只会返回一条记录。尝试做一个选择,而不是在两个表中存在的特定报价上进行更新,然后查看是否返回两条记录。您将不得不修改连接以获取返回的一个报价记录。