- 6.1. 基本的な結合
- 6.2. 自己結合
- 6.3. 特殊な結合演算子
- 1. CROSS JOIN
- 2. 自然結合
- 3. 指定結合
- 4. UNION JOIN
6.3.3. 指定結合
指定結合とは、結合を行う方法を指定する述語を作成する ON 形式か、等価結合を行う列集合を列挙する USING 形式という方法で、テーブルを結合する方法を直接指定する結合のことです。
sample.17-12 に ON 句を用いて、受注表と顧客表を指定結合した例を示します。
-- sample.17-12 --/* 指定結合 */ SELECT 受注表.受注番号,顧客表.顧客名 FROM 受注表,顧客表 ON 受注表.顧客コード = 顧客表.顧客コード ;
/* 実行結果 */ 受注番号 顧客名 ─────── ──────────── 10001 KUROKIYA 10002 ONSIDE 10003 KUSHINANA 10004 KUSHINANA 10005 ONSIDE 10006 KUROKIYA 10007 FIRST HOUSE 10008 KUSHINANA 10009 FIRST HOUSE 10010 KUROKIYA 10011 FIRST HOUSE 10012 KUSHINANA
sample.17-12 はこれまでに説明してきたように、ON 句を用いた指定結合ではなく WHERE 句を用いて sample.17-13 のように記述できます。
-- sample.17-13 --/* 自然結合 */ SELECT 受注表.受注番号,顧客表.顧客名 FROM 受注表,顧客表 WHERE 受注表.顧客コード = 顧客表.顧客コード ;
/* 実行結果 */ 受注番号 顧客名 ─────── ──────────── 10001 KUROKIYA 10002 ONSIDE 10003 KUSHINANA 10004 KUSHINANA 10005 ONSIDE 10006 KUROKIYA 10007 FIRST HOUSE 10008 KUSHINANA 10009 FIRST HOUSE 10010 KUROKIYA 10011 FIRST HOUSE 10012 KUSHINANA
ON 句と WHERE 句は同時に使用することが可能です。次の sample.17-14 のように、結合述語は ON 句に配置し、WHERE 句は述語のフィルタリングに使用すれば、WHERE 句だけで記述した場合よりもすっきりとします。
-- sample.17-14 --/* 指定結合 */ SELECT 受注表.受注番号,顧客表.顧客名 FROM 受注表,顧客表 ON 受注表.顧客コード = 顧客表.顧客コード WHERE 顧客表.顧客名 = 'ONSIDE';
/* 実行結果 */ 受注番号 顧客名 ─────── ──────────── 10002 ONSIDE 10005 ONSIDE
USING 形式は、引数としてカンマで区切られた列名リストを取り、同じ名前を持つ列のすべての組みに等価結合を実行し、AND を使って結果を組み合わせます。つまり、同じ名前を持つ列をすべて利用して結合するのではなく、選択したものだけを使用してテーブルを結合します。sample.17-15 に USING 形式を用いた場合の例を示します。
-- sample.17-15 --/* 指定結合 */ SELECT 受注表.受注番号,商品表.商品名 FROM 受注表,商品表 USING(商品コード) WHERE 商品表.単価 >= 500;
/* 実行結果 */ 受注番号 商品名 ─────── ────── 10002 BEER 10003 BEER 10005 WINE 10008 BEER 10010 BEER 10012 BEER
sample.17-15 の場合、本当は USING 句を用いて結合の形式を指定する必要がありません。それは、受注表と商品表の列名が同じなのは、商品コード一つだけだからです。もし、二つある場合には明示的に指定しないと、期待したとおりのデータが参照できない場合があります。また同じ名前の列が二つ以上ある場合、USING(列名,列名,....) として複数の列を指定して結合させることもできます。
指定結合には、自然結合で説明した INNER JOIN, LEFT [OUTER] JOIN, RIGHT [OUTER] JOIN, FULL [OUTER] JOIN のカテゴリがあります。効果は自然結合の節で説明したのと同じです。指定結合の場合、[NATURAL] は記述しないところに注意が必要です。
6.3.4. UNION JOIN
UNION JOIN はデカルト積をベースとせず、述語を使用しない結合です。WHERE 句で述語を指定することはできますが、UNION JOIN は 2つのテーブルのデータを関連付けようとはしません。<テーブル A> と < テーブル B> の UNION JOIN は <テーブル A> の列値をすべて出力し、同じ行の <テーブル B> の列を NULL で埋めます。次に、<テーブル B>の列値をすべて出力し、同じ行の <テーブル A> の列を NULL で埋めます。sample.17-16 に受注表と商品表の UNION JOIN の例を示します。利用価値はほとんどありません。
-- sample.17-16 --/* UNION 結合 */ SELECT 受注表.受注番号,商品表.商品名 FROM 受注表 UNION JOIN 顧客表 ;
/* 実行結果 */ 受注番号 商品名 ─────── ──────────── 10001 NULL 10002 NULL 10003 NULL 10004 NULL 10005 NULL 10006 NULL 10007 NULL 10008 NULL 10009 NULL 10010 NULL 10011 NULL 10012 NULL 10013 NULL NULL BEER NULL JUICE NULL TEA NULL WINE