joined-table
結合表 (joined table) は、 内部結合または外部結合のいずれかの結果である中間結果の表を指定します。 この表は、結合演算子 CROSS、INNER、LEFT OUTER、RIGHT OUTER、または FULL OUTER のいずれかをそのオペランドに適用して得ることができます。
結合には以下のようなタイプがあります。
- クロス結合
- 表のクロス積を表し、左側の表の各行は右側の表の各行と結合されます。
- 内部結合
- 結合条件が真になる行だけが保持されます。結合条件が偽になる行は (どちらの表の行であれ) 結果表から除外されます。
- 外部結合
- 結合条件が真になる行と、追加の行が組み込まれます。
- 左外部結合
- 結合条件が偽になる左の表の行も組み込まれます。
- 右外部結合
- 結合条件が偽になる右の表の行も組み込まれます。
- 全外部結合
- 結合条件が偽になる左右両方の表の行も組み込まれます。
複数の結合が行われる順序は、結果に影響を与えます。
結合は、他の結合内にネストすることができます。
結合の処理順序は、通常、左から右方向ですが、必要な結合条件の位置に基づきます。
ネストする結合の順序を明示するために、括弧を使用できます。例えば、以下の 2 つのステートメントは同等です。
T1 LEFT JOIN T2 ON T1.C1=T2.C1
RIGHT JOIN T3 LEFT JOIN T4 ON T3.C1=T4.C1
ON T1.C1=T3.C1 (T1 LEFT JOIN T2 ON T1.C1=T2.C1)
RIGHT JOIN (T3 LEFT JOIN T4 ON T3.C1=T4.C1)
ON T1.C1=T3.C1
結合表は、SELECT ステートメントの形式のいずれかが使用されるコンテキストであれば、 どのようなコンテキストでも使用することができます。 その SELECT ステートメントに結合表が入っている場合には、 ビューまたはカーソルは読み取り専用です。
列参照は、列名の修飾子を解決するための規則を使用して解決されます。 述部に適用されるのと同じ規則が、 結合条件にも適用されます。
結合操作
T1 の行が T2 の行に結合する場合、 結果の行は、T1 の行の値が T2 の行の値と連結された値で構成されます。 結合操作の結果、NULL 行が生成されることもあります。NULL 行とは、表の列で NULL 値が許容されているかどうかにかかわりなく、各列に NULL 値が入っている行のことです。
以下のリストに、結合演算の結果を要約します。
- T1 CROSS JOIN T2 の結果は、これらの表の行の可能なペアすべてで構成されます。
- T1 INNER JOIN T2 の結果は、結合条件が真であるペアの行で構成されます。
- T1 LEFT OUTER JOIN T2 の結果は、結合条件が真であるペアの行、 およびペアになっていない T1 の行ごとに、 その行を T2 の NULL 行に連結したもので構成されます。 T2 から得られるすべての列には NULL 値を使用することができます。
- T1 RIGHT OUTER JOIN T2 の結果は、結合条件が真であるペアの行、 およびペアになっていない T2 の行ごとに、 その行を T1 の NULL 行に連結したもので構成されます。 T1 から得られるすべての列には NULL 値を使用することができます。
- T1 FULL OUTER JOIN T2 の結果は、ペアの行、 およびペアになっていない T2 の行ごとにその行を T1 の NULL 行に連結したもの、 およびペアになっていない T1 の行ごとにその行を T2 の NULL 行に連結したもので構成されます。 T1 および T2 から得られるすべての列には NULL 値を使用することができます。
結合条件
結合条件 とは、2 つの表を結合するための条件式のことです。 その条件式では、t1 と t2 のペアを指定します (t1 と t2 は、JOIN 演算子の左オペランドの表 (t1) と右オペランドの表 (t2) の名前です)。t1 および t2 の行の全通りの組み合わせについて、結合条件が真であれば、t1 の行は t2 の行とペアになります。
結合条件は検索条件とよく似ていますが、以下の点が違います。
- 参照値がオブジェクト ID 列以外の場合、間接参照操作または DEREF 関数を組み込むことはできない
- 結合条件 の式で参照される列は、 関連する結合のオペランド表のいずれかの列でなければならない (同じ結合表の節の範囲内)
- 全外部結合の結合条件 の式で参照される関数は、決定的なものでなければならず、外部アクションは持たない
- XMLQUERY または XMLEXISTS 式を組み入れることはできない
結合結果
以下のいずれかの節を指定することによって、結合結果に組み込む列を制御できます。
- ON <join-condition>
- この節は、結合する 2 つの表に適用する条件式を指定できます。
例:
結合結果には、t1 の全列と、それに続く t2 の全列が含まれます。SELECT * FROM t1 JOIN t2 ON t1.c1 = t2.c1 AND t1.c2 = t2.c2; - USING <column-list>
- この節は、指定した列について表を結合します。いずれの列も、結合する表の両方に存在します。
列の値が両方の表で同じである場合に、表は結合されます。
例:
結合結果に組み込まれる列は、結合タイプによって異なります。SELECT * FROM t1 JOIN t2 USING (c1, c2);- 内部結合または左外部結合の場合
- 結合結果に t1 の結合列が組み込まれ、その後に t1 の非結合列、その後に t2 の非結合列が組み込まれます。
- 右外部結合の場合
- 結合結果に t2 の結合列が組み込まれ、その後に t1 の非結合列、その後に t2 の非結合列が組み込まれます。
- 全外部結合の場合
- 結合結果に結合列の非 NULL 値が組み込まれ、その後に t1 の非結合列、その後に t2 の非結合列が組み込まれます。
USING 節の結合列を、その後の他の節 (WHERE 節、ON 節、ORDER BY 節、GROUP BY 節、HAVING 節など) が非修飾形式で参照している場合、その参照先は結合結果の列に解決されます。
例:
CREATE TABLE t1 (c1 int, c2 varchar(10), c3 numeric(4,2));
CREATE TABLE t2 (c1 bigint, c2 char(8), c4 numeric(6,3));
CREATE TABLE t3 (c3 bigint, c5 int, c6 numeric(6,3));SELECT * FROM t1 FULL JOIN t2 USING (c1, c2) JOIN t3 ON (c1 = t3.c3);
Column projections:
CASE WHEN (t1.c1 IS NOT NULL) THEN t1.c1 ELSE t2.c1 END AS c1
CASE WHEN (t1.c2 IS NOT NULL) THEN t1.c2 ELSE t2.c2 END AS c2
t1.c3
t2.c4
t3.c3
t3.c5
t3.c6ON 節での列 c1 の参照は、全外部結合の結合列 c1 に相当する CASE 式に解決されます。したがって、ON 節は以下のように変換されます。ON ((CASE WHEN (t1.c1 IS NOT NULL) THEN t1.c1 ELSE t2.c1 END) = t3.c3)次の制限が適用されます。
- ON 節および USING 節は、特定の結合操作では相互に排他的です。つまり、2 つの表を結合するときに、これらの節のどちらか一方しか使用できません。 ただし、単一の SQL ステートメントに複数の結合操作を含めることができ、結合操作のそれぞれでどちらか一方の節を使用できます。
- 外部結合演算子として正符号 (+) が使用される場合、ON 節や USING 節は使用できません。
例
以下の 3 つの表を作成したとします。
CREATE TABLE t1 (c1 int, c2 varchar(10), c3 numeric(4,2));
CREATE TABLE t2 (c1 bigint, c2 char(8), c4 numeric(6,3));
CREATE TABLE t3 (c3 bigint, c5 int, c6 numeric(6,3));- ON 節を使用した結合の場合:
SELECT * FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 AND t1.c2 = t2.c2; Column projections: t1.c1, t1.c2, t1.c3, t2.c1, t2.c2, t2.c4SELECT * FROM t1 FULL JOIN t2 ON t1.c1 = t2.c1 AND t1.c2 = t2.c2; Column projections: t1.c1, t1.c2, t1.c3, t2.c1, t2.c2, t2.c4 - USING 節を使用した内部結合または左外部結合の場合:
SELECT * FROM t1 INNER JOIN t2 USING (c1, c2); Column projections: t1.c1, t1.c2, t1.c3, t2.c4SELECT * FROM t1 LEFT JOIN t2 USING (c1, c2); Column projections: t1.c1, t1.c2, t1.c3, t2.c4 - USING 節を使用した右外部結合の場合:
SELECT * FROM t1 RIGHT JOIN t2 USING (c1, c2); Column projections: t2.c1, t2.c2, t1.c3, t2.c4 - USING 節を使用した全外部結合の場合:
SELECT * FROM t1 FULL JOIN t2 USING (c1, c2); Column projections: CASE WHEN (t1.c1 IS NOT NULL) THEN t1.c1 ELSE t2.c1 END AS c1 CASE WHEN (t1.c2 IS NOT NULL) THEN t1.c2 ELSE t2.c2 END AS c2 t1.c3 t2.c4
