次の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
句の配置は、logicalの評価順序を制御します。
したがって、最初にt1 LEFT JOIN t2 ON t1.fk = t2.pk
が発生します。この結合の結果は、t1, t2
からのすべての一致する行を含む仮想テーブルであり、(左外部結合であるため)一致しないt1
行もt2
列のnull値で保持されます。
次に、この仮想テーブルは次の結合に参加します。 JOIN t3 ON t2.fk = t3.pk
t2
の行と一致しないt1
レコードは、最初のステージからの仮想テーブル出力の一部ではないため、最終結果には表示されません。さらに、t2.fk = t3.pk
でのこの内部結合は、t2.fk
のNULL
値をすべて失い、事実上すべてを内部結合に戻します。
論理クエリ処理はよく説明されています ここではItzik Ben Ganによって