WHERE句の条件式において、表結合として付帯したい表の列に外部結合演算子である(+)を付加することで結合表(OUTER JOIN)と同じ、外部結合を実現します。
注意
ここでは、SELECT文のWHERE句のみを抜粋しています。SELECT文全体の記述形式については、“PostgreSQL文書”の“リファレンス”の“SQLコマンド”を参照してください。
WHERE句は、導出される表に対して探索条件、または結合条件を指定します。
探索条件は、評価の結果としてBOOLEAN型を返す任意の式です。この条件を満たさない行はすべて出力から取り除かれます。すべての変数に実際の行の値を代入して、式が真を返す場合、その行は条件を満たすとみなされます。
結合条件は、外部結合演算子を指定した比較条件です。結合条件を満たすすべての行と、結合条件を満たす行を除いた、一方の表のすべての行を返却します。
探索条件よりも結合条件の優先度が高くなります。したがって、結合条件で返却されたすべての行に対して探索条件が有効となります。
外部結合演算子を使用した問合せには、次の規則と制限事項があります。そのため、外部結合演算子よりも、FROM句の結合表(OUTER JOIN)を使用することをお薦めします。
外部結合演算子は、WHERE句にのみ指定できます。
外部結合演算子は、実表またはビューの列に対してのみ指定できます。
複数の結合条件によって外部結合を行いたい場合、すべての結合条件に対して外部結合演算子を指定する必要があります。
結合条件に定数を組み合わせる場合、対応する列指定に外部結合演算子を指定してください。指定していない場合は探索条件と評価されます。
表T1の列に外部結合演算子を指定して表T2と結合し、表T1と表T3を探索条件を使用して結合した場合、表T1の外部結合の結果行は返却されません。
結合条件の左右の列指定に、同一テーブル上の列を指定することはできません。
外部結合演算子を列指定以外の式に指定することはできませんが、式を構成する列に対しては指定することができます。
外部結合演算子は結合表(OUTER JOIN)の機能と比較して以下の機能制限があります。外部結合演算子で使用できない機能を使用したい場合は、結合表(OUTER JOIN)を使用してください。
結合表(OUTER JOIN)で使用できる機能 | 外部結合演算子 |
---|---|
2つの表の外部結合 | ○ |
3つ以上の表の外部結合 | ○(注) |
同一問合せ内での結合表との併用 | × |
結合条件へのOR論理演算子の使用 | × |
結合条件へのIN述語の使用 | × |
結合条件への副問合せの使用 | × |
○:使用できます
×:使用できません
注) 外部結合演算子における外部結合では、他の1つの表に対してのみ外部結合結果を返すことができます。そのため、表T1と表T2、および表T2と表T3の組み合わせで外部結合を行いたい場合、表T2に対して外部結合演算子を同時に指定することはできません。
例
【表の構成】
t1
col1 | col2 | col3 |
1001 | AAAAA | 1000 |
1002 | BBBBB | 2000 |
1003 | CCCCC | 3000 |
t2
col1 | col2 |
1001 | aaaaa |
1002 | bbbbb |
1004 | ddddd |
例1) 次の例では、表t1に存在しないレコードを含めた表t2のすべてのレコードを返却します。
SELECT * FROM t1, t2 WHERE t1.col1(+) = t2.col1; col1 | col2 | col3 | col1 | col2 ------+------------+------+------+------------ 1001 | AAAAA | 1000 | 1001 | aaaaa 1002 | BBBBB | 2000 | 1002 | bbbbb | | | 1004 | ddddd (3 rows)
これは、次に示すFROM句の結合表(OUTER JOIN)の構文と同じ問合せです。
SELECT * FROM t1 RIGHT OUTER JOIN t2 ON t1.col1 = t2.col1;
例2) 次の例では、表t1に存在しないレコードを含めた表t2のレコードから、探索条件でt1.col3が2000以上であるレコードに絞り込みをして返却します。結合条件で優先的に絞り込んだ後、探索条件によって絞り込まれるため、返却されるレコードは1レコードのみとなります。
SELECT * FROM t1, t2 WHERE t1.col1(+) = t2.col1 AND t1.col3 >= 2000; col1 | col2 | col3 | col1 | col2 ------+------------+------+------+------------ 1002 | BBBBB | 2000 | 1002 | bbbbb (1 row)
これは、次に示すFROM句の結合表(OUTER JOIN)の構文と同じ問合せです。
SELECT * FROM t1 RIGHT OUTER JOIN t2 ON t1.col1 = t2.col1 WHERE t1.col3 >= 2000;