3

テーブルがあるとします

 Table A
 ---------------
 id    date_id (yyyyMMdd format)
 ---------------
 1     20120101
 2     20120102
 3     20120103

行うことの違いは何ですか:

 select a1.* from A a1
 left outer join A a2
     on a1.id = a2.id 
     and a1.date_id < a2.date_id
 where a1.date >= 20120103
 and a2.id is null

 select a1.* from A a1
 left outer join A a2
      on a1.id = a2.id
      and a1.date_id < a2.date_id
      and a1.date_id >=20120103
 where a2.id is null

最初に取得したクエリについて

 id   date_id
 --------------
 3    20120103

予想どおりですが、2番目のものについては取得します(クエリで選択されていないa2列ですが、わかりやすくするためにここに表示されています)

 a1.id   a1.date_id  a2.id   a2.date_id
 ---------------------------------------
 1       20120101    
 1       20120101    
 2       20120102
 2       20120102
 3       20120103

2 番目のクエリも でフィルタリングするべきではありませんa1.date_id >= 20120103か? date_id の行を返すのはなぜ20120101 and 20120102ですか?

4

2 に答える 2

1

外部結合の場合、ON句は外部テーブルに影響を与えません。これは、外部テーブルのすべての行が返され、ON句によって、結合されたテーブルのどの行が外部テーブルに結合するかが決定されることを意味します。また、句の条件を満たさない外部テーブルの行はON、結合されているテーブルの列のnull値で拡張されます。WHERE句は、最終結果セットをフィルタリングします。

于 2012-12-18T18:32:42.950 に答える
0

最初のクエリでは、最初に on の結果セットを取得します

a1.id = a2.id 
     and a1.date_id < a2.date_id and then it will apply the `where clause` in the result set and so you get '20120103'.

2 番目のクエリでは、条件を満たすすべてのレコードを取得しています。

on a1.id = a2.id
      and a1.date_id < a2.date_id
      and a1.date_id >=20120103

それが、これらの多くの行を取得する理由です。これがお役に立てば幸いです。

于 2012-12-18T18:07:53.620 に答える