2013-05-15 6 views
5

私は、フィルタ条件をクエリのWHERE句に追加して、結合で返される行の数を最小限に抑えることを推奨しますが、 FROMではなくWHEREでフィルタを追加する必要があるかどうかを判断します。私が代わりにWHERE句でのAND b.ColDを追加した場合どのようなこのクエリでWHEREとFROMの間にフィルタを追加する

SELECT a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM TblA a INNER JOIN TblB b 
On a.ColA = b.ColD 
AND a.ColA = 'X' 
AND a.ColB = 'Y' 
WHERE b.ColD = 'ABC' 

:たとえば?クエリをより効率的にすることはできませんか?私は時々両方のアプローチで結果が異なることがあることを知っていますが、なぜわからないのですか?

ありがとうございました。

+0

tsqlタグで判断すると、SQL Serverを使用しています。管理スタジオにはクエリの実行計画を表示できるため、両方のバージョンの違いを比較できます。私の_guess_は大きな違いはありません。 –

+3

これは重複していません:OPはフィルターについて質問しています.JOINではありません – gbn

+1

@gbn OPの言葉(「フィルター」と「条件」など)が非常に重要なのかどうかはわかりません。OP基本的に[ここ](http://stackoverflow.com/q/1907335/880904)、[ここ](http://stackoverflow.com/q/1018952/880904)、[ここではhttp: /stackoverflow.com/q/1401889/880904)、[here](http://stackoverflow.com/q/15483808/880904)などを参照してください。それらのすべてが 'JOIN ... ON'を持っていて、'どこに? 'と尋ね、同様の答えをあなたのものに含めます。この質問に答えられているか、私たちは[この質問]を再開すべきかどうかは私には分かりますか(http://stackoverflow.com/q/13145275/880904)? –

答えて

2

SQLなどの宣言型言語では、できるだけ宣言的にすること、つまりJOINロジック(「データをどのように接続したいのですか」)をWHEREロジックでる?")。

技術的には全く違いはありませんが、強制的に2つに分けるとよいでしょう。

9

私の経験はほとんど変わりません。それはできますが、しばしばそうではありません。 クエリオプティマイザはこれを実行し、それを推測する必要はありません。使用してLEFTがが参加したとき、それは一般的に、クエリセマンティクス

が変更されるため

は、それは I would separate JOIN and WHERE conditions for clarity and avoid ambiguities or partial/full cross joins、重要ですることができます。この答えは、より多くの情報のみ

注用です:質問は、私は単にこの

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    TblA a 
    INNER JOIN 
    TblB b On a.ColA = b.ColD 
WHERE 
    a.ColA = 'X' AND a.ColB = 'Y' AND b.ColD = 'ABC' 

を行うだろうない「WHEREの違いに登録しよう」ではなく「WHERE、JOIN違いで」

です私が作りたかった、より複雑な場合や、それがオプティマイザは愚かな(まれ)されている場合
これはまた助けることができる、より良い読み:

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    (SELECT ColA, ColB, ColC FROM TblA 
    WHERE ColA = 'X' AND ColB = 'Y') a 
    INNER JOIN 
    (SELECT ColD, ColE FROM TblB WHERE ColD = 'ABC') b On a.ColA = b.ColD 

この最後のケースでは、CTEも使用できます。可読性

関連する問題