2017-05-10 12 views
0

同じカラムを持ちながら行数が異なる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と同じルールが適用されると思います。

ご協力いただきありがとうございます。

答えて

3

サブクエリは関連付けられておらず、少なくとも1つの行を戻しています。したがって、existsは常にtrueを返し、削除操作はすべてを削除しようとします。

相関サブクエリでnot existsを使用してみてください:

delete 
from table1 t1 
where not exists (
     select 1 
     from table2 t2 
     where t1.compositekey1 = t2.compositekey1 
      and t1.compositekey2 = t2.compositekey2 
      and t1.compositekey3 = t2.compositekey3 
     ); 

あなたは左を使用してこれを行うことができますが、あまりにも参加:

また
delete t1 
from table1 t1 
left join table2 t2 on t1.compositekey1 = t2.compositekey1 
    and t1.compositekey2 = t2.compositekey2 
    and t1.compositekey3 = t2.compositekey3 
where t2.compositekey1 is null; 

、私はあなたのためにすべての3つの列をチェックしようとしていたことに気づきましたサブクエリではnullいずれか1つだけをチェックする必要があります。

+0

働いたこと。どうもありがとう。私はSQLの本を通過していますが、明らかにまだ十分に遠くはありません。 – DavidBoyd

0

また、これは動作するはずです:

DELETE 
FROM 
    table1 
WHERE 
    EXISTS 
    (
     SELECT 
      * 
     FROM 
      table2 
     WHERE 
      table1.compositekey1 = table2.compositekey1 
     AND table1.compositekey2 = table2.compositekey2 
     AND table1.compositekey3 = table2.compositekey3); 
関連する問題