在尝试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)
你知道怎么写直接的推理吗?
答案 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
不正确。