.-INNER-----. >>-+-table-reference--+-----------+---JOIN--table-reference--ON--join-condition--+-> | '-| outer |-' | '-(--joined-table--)----------------------------------------------------------' >-------------------------------------------------------------->< outer .-OUTER-. |----+-LEFT--+---+-------+--------------------------------------| +-RIGHT-+ '-FULL--'
結合表 (joined table) は、 内部結合または外部結合のいずれかの結果である中間結果の表を指定します。 この表は、結合演算子 INNER、LEFT OUTER、RIGHT OUTER、 または FULL OUTER のいずれかをそのオペランドに適用することによって求められます。
内部結合は、表のクロス・プロダクト (左側の表の各行を右側の表の各行に結合する)と見なすことができ、 結合条件が真である行のみを保持します。 結果表では、結合された表の一方または両方からの行が欠落している場合があります。 外部結合には、内部結合が含まれ、このような欠落行を保持します。 外部結合には、次の 3 種類のものがあります。
結合演算子の指定がない場合、INNER が暗黙の指定になります。 複数の結合が行われる順序は、結果に影響を与えます。 結合は、他の結合内にネストすることができます。 結合の処理順序は、通常、左から右方向ですが、必要な結合条件の位置に基づきます。 ネストされた結合の順序を読みやすくするために、括弧の使用をお勧めします。 たとえば、
tb1 left join tb2 on tb1.c1=tb2.c1 right join tb3 left join tb4 on tb3.c1=tb4.c1 on tb1.c1=tb3.c1
これは、以下と同等です。
(tb1 left join tb2 on tb1.c1=tb2.c1) right join (tb3 left join tb4 on tb3.c1=tb4.c1) on tb1.c1=tb3.c1
結合表は、SELECT ステートメントの形式のいずれかが使用される文脈であれば、 どのような文脈でも使用することができます。 その SELECT ステートメントに結合表が含まれている場合には、 視点またはカーソルは読み取り専用です。
join-condition (結合条件) は search-condition (検索条件) です。 ただし、以下の点で異なっています。
結合条件が上記の規則にしたがっていない場合、 エラーが生じます (SQLSTATE 42972)。
列参照は、列名の修飾子を解決するための規則を使用して解決されます。 述部に適用されるのと同じ規則が、 結合条件 にも適用されます (述部 を参照)。
結合条件 は、T1 と T2 のペアを指定します。 ここで、T1 および T2 は、 結合条件 の JOIN 演算子の左と右のオペランド表です。 T1 および T2 の行のすべての組合わせについて、 結合条件 が真であれば、T1 の行は T2 の行とペアになります。 T1 の行が T2 の行に結合する場合、 結果の行は、T1 の行の値が T2 の行の値と連結された値で構成されます。 この実行には、NULL 行の生成が含まれる場合があります。 表の NULL 行は、列がヌル値を許すか否かに関係なく、 表の各列のヌル値で構成されます。
以下に、結合演算の結果を要約します。
>>-WHERE--search-condition-------------------------------------><
WHERE 文節は、 search-condition (検索条件) が真である R の行で構成される中間結果表を指定します。 R は、その副選択の FROM 文節の結果です。
search-condition は、以下の規則に適合していなければなりません。
search-condition 内の副照会は、R の各行に対して実際に実行され、 search-condition を R のその行に適用するときにその結果が使用されます。 副照会が実際に R の各行に対して実行されるのは、 その中に相関参照が含まれる場合だけです。 実際、相関参照のない副照会は 1 回しか実行されませんが、 相関参照のある副照会は、各行ごとに 1 回ずつ実行されます。