2012-04-04 2 views
1

私はそれを実行すると、325行が影響を受けたという以下のクエリを持っています。しかし、クエリのSELECT部分​​だけを実行すると、331の結果が返されます。つまり、クエリ全体が実行されると、325行だけが更新され、331は更新されません。この不一致が何であるかはわかりません。私はそれだけで、クエリのSELECT部分​​は331行を返す325行のどのように異なる結果を返す2つのクエリ間の不一致を把握することができます

このアップデートの結果が

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部分​​で見つかったすべての行を更新したいです

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 

これは基本的に左結合であり、左結合がない行だけを返します。それは、テーブルAから欠けている6行を教えてください

0

してみてください:差がinner join

1

ある

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 

明らかにあなたの内側のSELECTステートメントが325成功裏ON A.c_id = X.c_id経由tableAに結合されたの331行を返しています。おそらく、内側の選択から返された行のうち6行がtableAの行と一致しないため、(OUTER JOINではないため)ドロップされます。

関連する問題