私はMS-SQLデータベースでいくつかの壊れたレコードを見つけようとしています。簡単な例では、のscenerioはこの2つのテーブル間で一致しないレコードを見つける最も速い方法は何ですか?
されています:
私は2つのテーブルを持って、簡単に言えば:
TABLE_1:ID、日付、OPID
Table_2:日付、OPID 、EventName
私はこのビジネスルールを持っています:もしテーブル1に記録があればTable_1.DateとTable.OpIdのTable_2には少なくともN行が1つ存在する必要があります。
Table_1に行があり、その行とTable_2に一致する行がない場合は、理由が何であれ、壊れたデータがあります。
私が使用し、不正なデータを見つけるために:
SELECT *
FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.Date = t2.Date AND t1.OpId = t2.OpId
WHERE t2.OpId IS NULL -- So, if there is no
-- matching row in table_2 then this is a mistake
しかし、それは、クエリが完了したために時間がかかりすぎます。
同様の風景にもっと速く、より良い方法がありますか?抗セミは、SQL ServerでNOT EXISTS
に参加行うに
速いかもしれません!出来た!なぜこのクエリーでははるかに高速ですか? – pencilCake
EXCEPTとNOT EXISTSは通常同じです。さらに詳しいリファレンスはhttp://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ – gbn
@gbn - 'EXCEPT'です最初のテーブルから追加のカラムを必要としない場合にのみ便利です。しかし、 'NOT EXISTS'は良いデフォルトの選択です。 (私は「それ以上」と言っていました) –