1

クエリを試行しているときに、1 つの条件を句から句に変更すると結果が変わるouter joinことに気付きました。びっくりしましたが、以下のようにテーブルとクエリを簡略化したので、理解できたと思いますが、しっかりした説明を聞きたいです。wherejoin

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)

次に、条件の 1 つをwherethe 句から tojoin句に移動します。

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)

ストレートな理由付けの書き方を知っていますか?

4

1 に答える 1

6

on条件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句が 2 番目の行を除外する理由がわかりnull = 2ます。これは true ではありません。

于 2012-06-09T17:12:28.950 に答える