1

多くの列を含む 2 つのテーブル A と B があり、そのうちの 2 つは SKU と Typedesc を使用しています。

A と B を sku と typedesc で結合してテーブル C を作成しました

create table C as
    select A.*
    from A inner join
         B
         on A.sku=B.sku and trim(A.typedesc)=trim(B.typedesc)

Cには約があります。130,000 レコード

Cに存在するAの行を削除したい

delete from A A1
    where exists (select 1
                  from C c1
                  where A1.sku=c1.sku and trim(A1.typedesc)=trim(c1.typedesc)
                 )

145,000行が削除されたと言われています。

余分な 15,000 行はどこから来たのですか? 削除クエリに何か問題がありますか? したがって、2 つのテーブルを結合すると、C も 145,000 になるはずですが、代わりに 130,000 しかありません!! これはなぜですか?A または B には主キーが含まれていません。

A から B を直接削除しても、削除された行数は 145,000 のままです。

delete from A A1
    where exists (select 1
                  from B b1
                  where A1.sku=b1.sku and trim(A1.typedesc)=trim(b1.typedesc)
                 )
4

1 に答える 1

0

EXISTS問題ないように見えますが、どの行が削除されているかを確認しないと、問題が何であるかを判断するのは難しく、145,000 行をこれ以上確認したくありません:)

この代替手段を試して、違いがあるかどうかを確認してください。

DELETE FROM A
WHERE (SKU, TRIM(TypeDesc)) IN (SELECT SKU, TRIM(TypeDesc) FROM B)
于 2013-06-04T21:06:01.943 に答える