同じカラムを持ちながら行数が異なる2つのテーブルがあります。テーブルには3列の複合プライマリキーがあります。DELETE句は、SELECTサブクエリよりも多くの行を削除します。
元のテーブルtable1があり、データが削除されたために行が少ない更新されたテーブルtable2があります。私はtable1にはあるがtable2にはない行を返すSELECT文を持っています。それでも、WHERE EXISTSを使用してSELECT句をDELETE句にサブクエリとして配置すると、サブクエリ内の行だけでなく、テーブル1からすべての行を削除する必要があります。
コード:
DELETE FROM table1
WHERE EXISTS(
SELECT t1.*
FROM table1 AS t1 LEFT JOIN table2 AS t2
ON (t1.compositekey1 = t2.compositekey1)
AND (t1.compositekey2 = t2.compositekey2)
AND (t1.compositekey3 = t2.compositekey3)
WHERE (t2.compositekey1 IS NULL) AND
(t2.compositekey2 IS NULL) AND (t2.compositekey3 IS
NULL)
);
私は、スタンドアロンSELECTクエリとしてサブクエリをテストし、それが110行、正しい金額を返されたが、それ以上のDELETEクエリに入れたときに、すべての9600行を削除したいと考えています。私は、WHERE EXISTSがサブクエリによって返された仮想テーブルにあった行だけを削除すべきという印象を受けました。
逆クエリをINSERTクエリとして使用した場合、table1にないtable2のすべての行をテーブル1に挿入すると、正常に機能しました。
私はDELETEステートメントでどこがうまくいかないのか分かりません。
私が使用してみました:
WHERE t1.compositekey1, t1.compositekey2, t1.compositekey3 IN (......)
しかし、私は使用がEXISTSというエラーを取得します。これはアクセスデータベースで使用されているので、SQL Serverと同じルールが適用されると思います。
ご協力いただきありがとうございます。
働いたこと。どうもありがとう。私はSQLの本を通過していますが、明らかにまだ十分に遠くはありません。 – DavidBoyd