2017-10-21 3 views
0

外部結合を使用する場合、JOIN句とWHERE句のフィルタが異なることを理解しています。私はこれらの2つのテーブルがあるとしましょう。今、私は外部結合のフィルタの動作

select a.id as id1, a.value as value1, b.value as value2 
from table1 as a 
left join table2 on a.id=b.id and a.value=11 

結果は、この、VALUE1で余分な行をであるために照会する場合

table1 
id | value 
---+------ 
1 | 11 
2 | 12 

table2 
id | value 
---+------ 
1 | 101 

= 12

id1 | value1 | value2 
----+--------+-------- 
1 |  11 |  101 
2 |  12 | NULL 

しかし、私はwhere句にフィルタを入れた場合、それを私が欲しいものを私に与えます。問題はなぜそれがこのように振舞うのか?

+0

句の中の述語は、左サイドからの行が1つを用いて接合するか否かを判断します右側に。 where句の述語は、結合されたすべての行が一致した後に実行され、外側の行は結合の結果として保存されます。 –

答えて

0

左結合の例で使用される2番目の条件は、結合の対象となる行を制限します。句は、イベントの異なるシリーズを有する場合に、述語T2.VALUE=11移動

 
select f1.id as id1, t1.value as value1, t2.value as value2 
from t1 
left join t2 on t1.id=t2.id AND T2.VALUE=11 

t1 
id | value 
---+------ 
1 | 11 ONLY join on this row because t1.value=11 
2 | 12 

t2 
id | value 
---+------ 
1 | 101 this has t1.id=t2.id, so it does get joined 

which would produce this final result: 

id1 | value1 | value 2 
----+--------+-------- 
1 |  11 |  101 
2 |  12 | NULL 

、次のように

 
select f1.id as id1, t1.value as value1, t2.value as value2 
from t1 
left join t2 on t1.id=t2.id 
WHERE T2.VALUE=11 

t1 
id | value 
---+------ 
1 | 11 this row does meet t1.id=t2.id, so it gets joined 
2 | 12 this row does NOT meet t1.id=t2.id, FAILS to join 

t2 
id | value 
---+------ 
1 | 101 this row does meet t1.id=t2.id, so it gets joined 

which would produce this INTERIM result: 

id1 | value1 | value 2 
----+--------+-------- 
1 |  11 |  101 
2 |  12 | NULL 

NOW the where clause is considered 

id1 | value1 | value 2 
----+--------+-------- 
1 |  11 |  101 T2.VALUE does equal 11 so this row will be returned 
2 |  12 | NULL T2.VALUE does NOT = 11 so this row is NOT returned 

Thus the final result is: 

id1 | value1 | value 2 
----+--------+-------- 
1 |  11 |  101 
関連する問題