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

正如预期的那样,但是对于我得到的第二个(a2 列未在查询中选择,但为清楚起见在此处显示)

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

第二个查询不应该也过滤a1.date_id >= 20120103吗?为什么它返回带有 date_id's 的行20120101 and 20120102

4

2 回答 2

1

在外连接的情况下,ON子句对外表没有影响。这意味着将返回外部表中的所有行,并且ON子句仅确定联接表的哪一行加入外部表。并且那些不满足ON子句中条件的外部表行将简单地扩展为正在连接的表的列的空值。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'.

在第二个查询中,您将获取所有满足

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

这就是为什么你得到那么多行。希望这对您有所帮助。

于 2012-12-18T18:07:53.620 回答