OUTER JOIN中的条件与WHERE条件中的结果不同

时间:2012-06-09 17:06:05

标签: sql postgresql

在尝试outer join查询时,我注意到将一个条件从where子句更改为join子句会更改结果。这让我感到惊讶,但我简化了表格和查询,如下所示,现在我想我明白了,但我想听听一个可靠的解释。

create table t0 (id int, b int);
create table t1 (id int, b int);
insert into t0 (id, b) values (1, 10), (2, 10);
insert into t1 (id, b) values (1, 2);

select t0.id, t0.b
from t0
left outer join t1 on 
    t0.id = t1.id
where
    t0.b = 10
    and
    t1.b = 2
;
 id | b  
----+----
  1 | 10
(1 row)

现在我将其中一个条件从where移到join子句:

select t0.id, t0.b
from t0
left outer join t1 on 
    t0.id = t1.id
    and
    t1.b = 2
where 
    t0.b = 10
;
 id | b  
----+----
  1 | 10
  2 | 10
(2 rows)

你知道怎么写直接的推理吗?

1 个答案:

答案 0 :(得分:6)

on的{​​{1}}条件仅确定outer join是否成功。如果连接失败,则已加入的列将填充join

另一方面,null子句过滤掉结果集中的整行。

为了使其更加清晰,请在结果集中添加where。将t1.b作为t1.b = 2条件,您会得到:

where

t0.id t0.b t1.id t1.b 1 10 1 2 作为t1.b = 2条件::

on

您可以看到t0.id t0.b t1.id t1.b 1 10 1 2 2 10 NULL NULL 子句过滤第二行的原因:where不正确。