目次へ
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

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp