2013-06-27 37 views
6

私は外部IDとローカルIDの間のマッピングであるテーブルを持っています。T-SQLの存在または存在する場合

このテーブルがバイジェクションであるかどうかを調べるクエリを作成する必要がありました。私はこの時に1人のを見ていたし、grimaced上司この

IF 1 <> ANY(
    SELECT COUNT(foreignId) 
    FROM mappingTable 
    GROUP BY localId 
    ) 
BEGIN 
    SELECT 'Oh noes!' 
END 

ELSE BEGIN 
    SELECT 'Everything is fine.' 
END 

を思い付いた、と私は、この代わりに書かれている必要があります私に言った:

IF EXISTS(
    SELECT NULL 
    FROM mappingTable 
    GROUP BY localId 
    HAVING COUNT(foreignId) <> 1 
    ) 
BEGIN 
    SELECT 'Oh noes!' 
END 

ELSE BEGIN 
    SELECT 'Everything is fine.' 
END 

私の質問は、より良いスタイルは、これらのクエリのどの単純です。私は彼らが同等であると確信しています。

+0

テーブルにUNIQUE制約を使用しないのはなぜ? UNIQUE(localId、foreignId)と同様に、各マッピングは一度しかインセプトできません。チェックはデータベースエンジンによって行われ、コードを書く必要はありません。 –

+0

@ JennyO'Reilly私は外部から受け取ったデータの健全性をチェックしようとしています。 –

+0

次に、テーブルと制約を最初に作成し、その後にデータを挿入してみます。データが正しくない場合、DBシステムはエラーをスローする必要があります。 :-) –

答えて

8

SQL Server 2008のテストでは、これらのクエリで同じ結果が得られるだけでなく、クエリプランも同じであることが示されています。クエリオプティマイザは、これらのクエリが同等であることを既に認識しています。だから、あなたが一番好きな議論は、スタイルのような他の側面に焦点を当てなければならないでしょう。

個人的には、EXISTSをはるかに超えてANYと表示されていたため、最初のクエリでは英語での検索方法をより詳しく説明していますが、2番目のクエリはわかりやすいです。最初の質問は私に「待てよ、何?ああ、そうだよ...」と言わせてくれる。第二はすぐにわかる。それは他人のために(おそらくあなたのために)異なるかもしれません。あなたはあなたの上司や同僚のためにあなたの質問を読むのが簡単であるようにするべきです。

2

あなたのクエリは、カラムにインデックスがあるかどうかに応じて、同じか悪いか、それと同等に優れています。

インデックスがない場合は、すべての行のテーブルスキャン/クラスタ化インデックススキャンの後に、重複を削除するハッシュマッチが続きます。

チェックしている列にインデックスがある場合、両方のクエリはそのインデックスを使用し、重複が見つかると早期に終了します。インデックスなし

enter image description here

クエリプラン:インデックスと

クエリプランに

enter image description here

関連する問題