2012-04-04 59 views
1

我有下面的查詢,當它運行時說,有325行受到影響。但是,如果我只運行查詢的SELECT部分​​,則返回331個結果。這意味着當整個查詢運行時,只有325行正在更新,而不是331.我不確定這種差異可能是什麼。我想它更新所有它所發現在查詢的SELECT部分​​的行如何找出返回不同結果的兩個查詢之間的差異

此更新導致325行更新

UPDATE A 
SET 
A.status = X.c 
FROM 
tableA A INNER JOIN (
    SELECT tableB.c_id, COUNT(*) as c 
    FROM tableB 
    LEFT JOIN tableC 
     ON tableB.c_id = tableC.c_id 
    WHERE tableC.c_id != tableC.c_id_update 
    GROUP BY tableB.c_id) X 
ON A.c_id = X.c_id 

而且只能運行在查詢的SELECT部分​​返回331行

SELECT tableB.c_id, COUNT(*) as c 
FROM tableB 
LEFT JOIN tableC 
    ON tableB.c_id = tableC.c_id 
WHERE tableC.c_id != tableC.c_id_update 
GROUP BY tableB.c_id 

我真的被困在搞清楚爲什麼有6(331-325)記錄沒有得到更新?!謝謝你的幫助。

回答

1

它可能是您的加入到TableA刪除6條記錄。尋找這樣的:

select x.* from 
(
SELECT tableB.c_id, COUNT(*) as c 
FROM tableB 
LEFT JOIN tableC 
    ON tableB.c_id = tableC.c_id 
WHERE tableC.c_id != tableC.c_id_update 
GROUP BY tableB.c_id 
) X 
left join tableA A on A.c_id = X.c_id 
where A.C_id is null 

本質上講,這是左連接,而你只返回在左連接不存在的行。它應該告訴你哪些6行從表A中缺失

0

現在試試:

select count(*) 
FROM 
tableA A INNER JOIN (
    SELECT tableB.c_id, COUNT(*) as c 
    FROM tableB 
    LEFT JOIN tableC 
     ON tableB.c_id = tableC.c_id 
    WHERE tableC.c_id != tableC.c_id_update 
    GROUP BY tableB.c_id) X 
ON A.c_id = X.c_id 

的區別是inner join

1

顯然你內心的SELECT語句返回331行,其中325成功通過ON A.c_id = X.c_id加入到tableA。所以大概有6個從你的內部select返回的行與tableA中的行不匹配,因此被丟棄(因爲它不是OUTER JOIN)。

相關問題