次の3つの方法で参加する場合
select t1.* from t1
left join t2 on t1.fk = t2.pk
join t3 on t2.fk = t3.pk
t2とt3の間の結合が失敗した場合、t1とt2の間の結合が成功した行が返されますか?操作の順序が左から右の場合はそうではないと思いますが、右から左に評価すると(t3が最初にt2に結合される)、前者が失敗した場合でもt1が返されます。
それはどのように機能しますか?
次の3つの方法で参加する場合
select t1.* from t1
left join t2 on t1.fk = t2.pk
join t3 on t2.fk = t3.pk
t2とt3の間の結合が失敗した場合、t1とt2の間の結合が成功した行が返されますか?操作の順序が左から右の場合はそうではないと思いますが、右から左に評価すると(t3が最初にt2に結合される)、前者が失敗した場合でもt1が返されます。
それはどのように機能しますか?
ON
句の配置は、評価の論理的な順序を制御します。
だから最初にt1 LEFT JOIN t2 ON t1.fk = t2.pk
起こります。この結合の結果は、からのすべての一致する行を含む仮想テーブルでt1, t2
あり、(左外部結合であるため)一致しないt1
行も列のnull値で保持されt2
ます。
次に、この仮想テーブルは次の結合に参加します。JOIN t3 ON t2.fk = t3.pk
t2
の行と一致しないレコードは、t1
最初のステージから出力された仮想テーブルの一部ではないため、最終結果には表示されません。さらに、この内部結合をオンにすると、すべてを効果的に内部結合に戻すという価値t2.fk = t3.pk
が失われます。NULL
t2.fk
論理クエリ処理は、ItzikBenGanによってここでよく説明されています