複数の 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 文節を指定します。