2

ON と WHERE がステートメントの実行にどのように影響するかを理解しようとしましたが、うまくいきませんでした..

期待される結果が得られる次のステートメントがあります。

     SELECT  DISTINCT u1.email
     FROM user u1
     LEFT JOIN user u2
     ON u1.email = u2.email
     WHERE u1.id != u2.id

正しい出力

ON と WHERE を入れ替えても同じ結果が得られますが、WHERE を削除すると、より多くの結果が得られます。

    SELECT  DISTINCT u1.email
    FROM user u1
    LEFT JOIN user u2
    ON u1.email = u2.email
    AND u1.id != u2.id

不正な出力

何故ですか ?

4

4 に答える 4

0

LEFT 結合を実行し、右テーブルから選択しても意味がありません。左結合を使用し、JOIN 句ですべての条件を適用すると、予期しない結果が生じる場合があります。WHERE は JOIN の結果の後に適用されるフィルターであるため、JOIN が INNER 結合でない限り、JOIN と Where の間の切り替え条件は同じではありません。JOIN を使用すると、より多くの結果が得られます。ただし、JOIN が INNER JOIN の場合、条件がどこにあっても同じ結果が得られます。

あなたの例では、WHEREを削除するだけで、u2からのすべての個別の電子メールを選択しています。そして、結合を残したままにすると、一致しない u2 行の soem は、WHERE 句の場合のようにフィルター処理されません。

于 2013-10-10T20:14:14.687 に答える
0

これは であるため、句が保持されない場合、からの値と からの NULL をLEFT JOIN含む行を取得します。ただし、句は結果セット全体に適用されるため、NULL であることが判明した場合は返されません。u1u2ONWHEREu2.id

に変更LEFT JOINするINNER JOINと、問題が解決します。

于 2013-10-10T20:10:56.303 に答える