複数の SELECT ステートメントからの結果表の結合

複数の SELECT ステートメントの結果を結合する際には、結果表に何を含めるかを選択できます。 結果表にすべての行を含めるか、両方の SELECT ステートメントの結果表にある行のみを含めるか、または最初の SELECT ステートメントの結果表に固有の行のみを含めるかを選択できます。

このタスクについて

以下のような結果表を返す 2 つの SELECT ステートメントの結果を結合するとします。

例: R1 結果表
COL1	 COL2
a	    a 
a	    b 
a	    c
例 : R2 結果表
COL1	 COL2 
a	    b 
a	    c 
a	    d

演算子の設定 で、 2 つ以上のSELECTステートメントを組み合わせて単一の結果表を形成できます。

UNION
UNIONは、各SELECTステートメントの結果表からすべての値を返します。 すべての重複行が結果表の中で繰り返し現れるようにする場合は、UNION ALL を指定します。 冗長な重複行を結果表から除去したい場合は、UNION または UNION DISTINCT を指定します。

例えば、以下の例は、 R1とR2にUNIONを指定した場合の結果です。

COL1	 COL2 
a	    a 
a	    b 
a	    c 
a	    d
EXCEPT
最初の結果表 (R1) にあって、2 番目の結果表 (R2) にはない行をすべて戻します。 R1 からの重複行がすべて結果表に含まれるようにする場合は、EXCEPT ALL を指定します。 R1 の冗長な重複行を結果表から除去したい場合は、EXCEPT または EXCEPT DISTINCT を指定します。

EXCEPT 演算の結果は、SQL ステートメント内で EXCEPT キーワードの前にどの SELECT ステートメントが含まれているかによって異なります。 たとえば、R1結果表を返すSELECTステートメントが最初にリストされている場合、結果は単一の行になります。

COL1	 COL2 
a	    a

R2 結果表を戻す SELECT ステートメントが最初にリストされていれば、最終結果は異なる行になります。

COL1	 COL2 
a	    d
INTERSECT
両方の SELECT ステートメントの結果表にある行を戻します。 すべての重複行が結果表に含まれるようにする場合は、INTERSECT ALL を指定します。 冗長な重複行を結果表から除去したい場合は、INTERSECT または INTERSECT DISTINCT を指定します。

例えば、以下の例は、 R1とR2にUNIONを指定した場合の結果です。

COL1	 COL2 
a	    b  
a	    c

いずれかのセット演算子を指定すると、Db2 は各 SELECT ステートメントを処理して一時結果表を形成し、各ステートメントの中間結果表をバインドします。 最初の結果表(R1)のn番目の列と2番目の結果表(R2)のn番目の列の結果列名が同じである場合、結果表のn番目の列の結果列名は同じになります。 R1のn番目の列とR2のn番目の列の名前が同じでない場合、結果の列には名前が付けられません。

プロシージャー

  • 2つ以上のSELECTステートメントを組み合わせて単一の結果表を形成するには、集合演算子UNION、EXCEPT、またはINTERSECTを使用します。
    たとえば、2つの書店の在庫を管理するための次の表があるとします。
    表 1. STOCKA
    ISBN TITLE AUTHOR NOBEL PRIZE
    8778997709 誰がために鐘は鳴る ヘミングウェイ N
    4599877699 大地 バック Y
    9228736278 二都物語 ディケンズ N
    1002387872 ビラヴド モリスン Y
    4599877699 大地 バック Y
    0087873532 孤独の迷宮 パス Y
    表 2. STOCKB
    ISBN TITLE AUTHOR NOBEL PRIZE
    6689038367 怒りの葡萄 スタインベック Y
    2909788445 万延元年のフットボール 大江 Y
    1182983745 八月の光 フォークナー Y
    9228736278 二都物語 ディケンズ N
    1002387872 ビラヴド モリスン Y
    例: UNION節
    著者がノーベル賞受賞者である書籍のうち、どちらかの店舗に在庫がある書籍のリストが必要な場合を考えます。 次の SQL ステートメントは、冗長な重複行を含まずに、該当する書籍を著者名順に戻します。
    SELECT TITLE, AUTHOR
      FROM STOCKA
      WHERE NOBELPRIZE = 'Y'
    UNION
    SELECT TITLE, AUTHOR
      FROM STOCKB
      WHERE NOBELPRIZE = 'Y'
     ORDER BY AUTHOR

    このステートメントは、次の最終結果表を戻します。

    表 3. UNION の結果
    TITLE AUTHOR
    大地 バック
    八月の光 フォークナー
    ビラヴド モリスン
    万延元年のフットボール 大江
    孤独の迷宮 パス
    怒りの葡萄 スタインベック
    例: EXCEPT節
    STOCKA にのみ在庫がある書籍のリストが必要な場合を考えます。 次の SQL ステートメントは、冗長な重複行を除いて、STOCKA のみにある書名を戻します。
    SELECT TITLE
      FROM STOCKA
    EXCEPT
    SELECT TITLE
      FROM STOCKB
      ORDER BY TITLE;

    このステートメントは、次の結果テーブルを返します。

    表 4. EXCEPT の結果
    TITLE
    誰がために鐘は鳴る
    大地
    孤独の迷宮
    例: INTERSECT節

    STOCKA と STOCKB の両方に在庫がある書籍のリストが必要な場合を考えます。 次のステートメントは、冗長な重複行を除去して、これら両方の表からすべての書籍のリストを返します。

    SELECT TITLE
      FROM STOCKA
    INTERSECT
    SELECT TITLE
      FROM STOCKB
      ORDER BY TITLE;
    このステートメントは、次の結果テーブルを返します。
    表 5. INTERSECT の結果
    TITLE
    二都物語
    ビラヴド
  • 結果表をバインドするときにすべての重複行を保持するには、 ALL キーワードを set 演算子節とともに指定します。

    次の例では、前の手順のSTOCKA表とSTOCKB表を使っています。

    例: UNION ALL
    次の SQL ステートメントは、ノーベル賞を受賞した書籍のうち、どちらかの店舗に在庫がある書籍のリストを、重複も含めて返します。
    SELECT TITLE, AUTHOR
      FROM STOCKA
      WHERE NOBELPRIZE = 'Y'
    UNION ALL
    SELECT TITLE, AUTHOR
      FROM STOCKB
      WHERE NOBELPRIZE = 'Y'
     ORDER BY AUTHOR

    このステートメントは、次の結果テーブルを返します。

    表 6. UNION ALL の結果
    TITLE AUTHOR
    大地 バック
    大地 バック
    八月の光 フォークナー
    ビラヴド モリスン
    ビラヴド モリスン
    万延元年のフットボール 大江
    孤独の迷宮 パス
    怒りの葡萄 スタインベック
    例: EXCEPT ALL
    STOCKA にのみ在庫がある書籍のリストが必要な場合を考えます。 次の SQL ステートメントは、冗長な重複行を含め、STOCKA のみにある書名を戻します。
    SELECT TITLE
      FROM STOCKA
    EXCEPT ALL
    SELECT TITLE
      FROM STOCKB
      ORDER BY TITLE;

    このステートメントは、次の結果テーブルを返します。

    表 7. EXCEPT ALL の結果
    TITLE
    誰がために鐘は鳴る
    大地
    大地
    孤独の迷宮
    例: INTERSECT ALL
    STOCKA と STOCKB の両方に在庫がある書籍のリスト (重複一致も含める) が必要な場合を考えます。 次のステートメントは、両方の在庫にある書名のリストを、重複するマッチング項目も含めて戻します。 この例では、「二都物語」に 1 つのマッチング項目が存在し、「ビラヴド」に 1 つのマッチング項目が存在します。
    SELECT TITLE
      FROM STOCKA
    INTERSECT ALL
    SELECT TITLE
      FROM STOCKB
      ORDER BY TITLE;

    このステートメントは、次の結果テーブルを返します。

    表 8. INTERSECT ALL の結果
    TITLE
    二都物語
    ビラヴド
  • 結果表を結合する際に重複行を除去するには、次のキーワードの 1 つを指定します。
    • UNION または UNION DISTINCT
    • EXCEPT または EXCEPT DISTINCT
    • INTERSECT または INTERSECT DISTINCT
  • 結果表全体の順序付けを行うには、最後に ORDER BY 文節を指定します。