OceanBaseデータベースのOracleモードでは、集合演算子 UNION、UNION ALL、INTERSECT、および MINUS を使用して複数のクエリを結合することができます。これらの集合演算子は、すべて同じ優先順位を持ちます。SQLステートメントが複数の集合演算子を含む場合、OceanBase データベースは、括弧で演算の順序を明示的に指定しない限り、左から右の順に処理を実行します。
本記事では、集合演算子 UNION、UNION ALL、INTERSECT および MINUS の使用方法について説明します。
構文
select_clause_set_left
{ UNION | UNION ALL | MINUS | INTERSECT}
select_clause_set_right
集合クエリ構文の詳細については、セット型SELECTを参照してください。
パラメータの説明:
select_clause_set_left:SELECTステートメントは、集合演算における左側のセットを返します。select_clause_set_right:SELECTステートメントは、集合演算における右側のセットを返します。UNION:複数のSELECTステートメントの結果セットを1つのセットに結合し、重複する行を除去します。UNION ALL:複数のSELECTステートメントの結果セットを1つのセットに結合し、重複する行をそのまま残します。INTERSECT:2つのSELECTステートメントの結果セットの共通部分を返します。MINUS:最初のSELECTステートメントの結果セットから、2番目のSELECTステートメントの結果セットに含まれていない行を返します。説明
OceanBaseデータベースOracleモードでは、
MINUSのみサポートされ、EXCEPTはサポートされていませんが、両者の意味は同じです。
集合演算子のルールと制限の詳細については、複合クエリを参照してください。
注意
各集合演算子は、SELECT ステートメントの結果セットに対してのみ操作でき、各結果セットの列数とデータ型は同一でなければなりません。
例
テストテーブル test_tbl1 と test_tbl2 があり、データは以下のとおりです:
obclient [SYS]> SELECT * FROM test_tbl1;
+------+------+
| ID | NAME |
+------+------+
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
| 4 | A4 |
| 5 | A5 |
| 6 | A6 |
+------+------+
6 rows in set
obclient [SYS]> SELECT * FROM test_tbl2;
+------+------+
| ID | NAME |
+------+------+
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
| 7 | A7 |
| 8 | A8 |
| 9 | A9 |
+------+------+
6 rows in set
UNIONの例
以下のSQLステートメントでは、UNION を使用して2つの SELECT ステートメントの結果セットを1つのセットに結合し、結合後の結果セットから重複する行を削除します。
SELECT id, name FROM test_tbl1
UNION
SELECT id, name FROM test_tbl2;
実行結果は次のとおりです:
+------+------+
| ID | NAME |
+------+------+
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
| 4 | A4 |
| 5 | A5 |
| 6 | A6 |
| 7 | A7 |
| 8 | A8 |
| 9 | A9 |
+------+------+
9 rows in set
UNION ALLの例
以下のSQLステートメントでは、UNION ALL を使用して2つの SELECT ステートメントの結果セットを1つのセットに結合し、結合後の結果セットから重複する行を削除しません。
SELECT id, name FROM test_tbl1
UNION ALL
SELECT id, name FROM test_tbl2;
実行結果は次のとおりです:
+------+------+
| ID | NAME |
+------+------+
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
| 4 | A4 |
| 5 | A5 |
| 6 | A6 |
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
| 7 | A7 |
| 8 | A8 |
| 9 | A9 |
+------+------+
12 rows in set
INTERSECTの例
以下のSQLステートメントでは、INTERSECT を使用して、2つの SELECT ステートメントの結果セットの共通部分を返します。
SELECT id, name FROM test_tbl1
INTERSECT
SELECT id, name FROM test_tbl2;
実行結果は次のとおりです:
+------+------+
| ID | NAME |
+------+------+
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
+------+------+
3 rows in set
MINUSの例
以下のSQLステートメントでは、MINUS を使用して、2番目の SELECT ステートメントの結果セットに含まれていない最初の SELECT ステートメントの結果セットの行を返します。
SELECT id, name FROM test_tbl1
MINUS
SELECT id, name FROM test_tbl2;
実行結果は次のとおりです:
+------+------+
| ID | NAME |
+------+------+
| 4 | A4 |
| 5 | A5 |
| 6 | A6 |
+------+------+
3 rows in set