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)ある理由を理解するのに本当に苦労していますか?!ご協力いただきありがとうございます。

4

3 に答える 3

1

明らかに、内部のselectステートメントは331行を返し、そのうち325行はviaをtableA介して正常に結合されましたON A.c_id = X.c_id。したがって、おそらく、内側のselectから返された6つの行が、の行と一致しないtableAため、ドロップされます(OUTER JOINではないため)。

于 2012-04-04T16:48:16.117 に答える
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

基本的にこれは左結合であり、左結合がない行のみを返します。TableAから欠落している6行を教えてくれるはずです

于 2012-04-04T16:49:16.010 に答える
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

于 2012-04-04T16:48:11.123 に答える