4

これらの2つの類似したSQLを検討してください

(ON句の条件)

select t1.field1, t2.field1
from
table1 t1 inner join table2 t2 on t1.id = t2.id and t1.boolfield = 1

(WHERE句の条件)

select t1.field1, t2.field1
from
table1 t1 inner join table2 t2 on t1.id = t2.id
where t1.boolfield = 1

これを少しテストしましたが、外部結合の2つの異なる場所に条件を設定することの違いを確認できます。しかし、内部結合の場合、結果セットが異なる可能性はありますか?

4

3 に答える 3

6

INNER JOINの場合、2番目のオプションの方がクリーンだと思いますが、効果的な違いはありません。

LEFT JOINの場合、大きな違いがあります。ON句は、比較のためにテーブルから選択されるレコードを指定し、WHERE句は結果をフィルタリングします。

例1:tbl 1からすべての行を返し、boolfield=1を持つtbl2からの適切な行とそれらを照合します

Select *
From tbl1
  LEFT JOIN tbl2 on tbl1.id=tbl2.id and tbl2.boolfield=1

例2:boolfield=1のtbl2に一致する行があるtbl1の行のみが含まれます。テーブルを結合し、条件を満たさない行を除外します。

Select *
From tbl1
  LEFT JOIN tbl2 on tbl1.id=tbl2.id
WHERE tbl2.boolfield=1
于 2012-07-19T18:59:43.557 に答える
2

特定のケースでは、t1.boolfieldは、2つのテーブル間でレコードを照合するための条件ではなく、追加の選択条件を指定するため、2番目の例の方が正確です。

レコードを照合するための条件がON句とWHERE句にある場合について話している場合は、この質問を参照してください

于 2012-07-19T18:53:14.003 に答える
1

どちらのバージョンも同じデータを返します。

これは内部結合には当てはまりますが、外部結合には当てはまりません。

様式的には、3番目の可能性があります。2つに加えて、次のものもあります。

select t1.field1, t2.field1
from (select t1.*
      from table1 t1
      where t1.boolfield = 1
     ) t1 inner join
     table2 t2
    on t1.id = t2.id

どちらが望ましいかは、強調したい内容によって異なります。そのため、あなた(または他の誰か)は後でクエリを理解して変更できます。クエリがテーブルの特定の行のみを使用していることを強調しているため、3番目のバージョンを好むことがよくあります。ブール条件は、テーブルが指定されている場所に非常に近いものです。

他の2つのケースでは、クエリが長い場合、「t1」が実際に何を意味するのかを理解するのが難しい場合があります。これが、条件をON句に入れることを好む人がいる理由だと思います。WHERE句を好む人もいます。

于 2012-07-19T18:59:41.380 に答える