集合演算子¶
集合演算子を使用すると、クエリを組み合わせることができます。
このトピックの内容:
一般的な構文¶
[ ( ] <query> [ ) ] { INTERSECT | { MINUS | EXCEPT } | UNION [ ALL ] } [ ( ] <query> [ ) ]
[ ORDER BY ... ]
[ LIMIT ... ]
一般的な使用上の注意¶
各クエリ自体にクエリ演算子を含めると、任意の数のクエリ式をセット演算子と組み合わせることができます。
ORDER BY 句と LIMIT / FETCH 句は、集合演算子の結果に適用されます。
これらの演算子を使用する場合:
各クエリが同じ数の列を選択することを確認してください。
各列のデータ型が、異なるソースからの行全体で一貫していることを確認してください。以下の 例 セクションの例の1つは、データ型が一致しない場合の潜在的な問題と解決策を示しています。
一般に、列の「意味」とデータ型は一致する必要があります。以下は、望ましい結果を生成しません。
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName, LastName FROM contractors;
アスタリスクを使用してテーブルのすべての列を指定すると、エラーのリスクが増加します。次に例を示します。
SELECT * FROM table1 UNION ALL SELECT * FROM table2;
テーブルの列数が同じであるが、列の順序が同じでない場合、クエリ結果は正確でない可能性があります。
出力列の名前は、最初のクエリ列の名前に基づいています。例えば、次のクエリ
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName, LastName FROM contractors;
は次のクエリであるように動作します。
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
セット演算子の優先順位は、ANSI および ISO SQL 標準と一致します。
UNION [ALL]
およびMINUS
(EXCEPT
)演算子の優先順位は同じです。INTERSECT
演算子は、UNION [ALL]
およびMINUS
(EXCEPT
)よりも優先順位が高くなります。
優先順位が等しい演算子は、左から右に処理されます。
括弧を使用して、式を強制的に異なる順序で評価することができます。
一部のデータベースベンダーは、集合演算子の優先順位について ANSI/ISO 標準に従っていません。Snowflakeは、特に別のベンダーからSnowflakeにコードを移植する場合や、Snowflakeだけでなく他のデータベースでも実行する可能性のあるコードを作成する場合に、括弧を使用して評価の順序を指定することをお勧めします。
INTERSECT¶
あるクエリの結果セットから行を返します。この行は別のクエリの結果セットにも表示され、重複を排除します。
構文¶
SELECT ...
INTERSECT
SELECT ...
MINUS , EXCEPT¶
別のクエリの結果セットに表示される1つのクエリの結果セットから行を削除し、重複を排除します。
MINUS および EXCEPT キーワードは同じ意味を持ち、同じ意味で使用できます。
構文¶
SELECT ...
MINUS
SELECT ...
SELECT ...
EXCEPT
SELECT ...
UNION [ ALL ]¶
2つのクエリの結果セットを結合します。
UNION は、重複排除と組み合わせます。
UNION ALL は、重複排除なしで結合します。
デフォルトは UNION (重複排除)です。
構文¶
SELECT ...
UNION [ ALL ]
SELECT ...
例¶
この例は、 UNION 演算子の基本的な使用法を示しています。また、データ型が一致しない場合の潜在的な問題を示し、ソリューションを提供します。
テーブルを作成し、いくつかのデータを挿入することから始めます。
CREATE TABLE t1 (v VARCHAR); CREATE TABLE t2 (i INTEGER); INSERT INTO t1 (v) VALUES ('Adams, Douglas'); INSERT INTO t2 (i) VALUES (42);
異なるデータ型で UNION 操作を実行します。
SELECT v FROM t1 -- VARCHAR UNION SELECT i FROM t2 -- INTEGER ;出力:
100038 (22018): Numeric value 'Adams, Douglas' is not recognized
次に、明示的なキャストを使用して、入力を互換性のある型に変換します。
SELECT v::VARCHAR FROM t1 UNION SELECT i::VARCHAR FROM t2;出力:
+----------------+ | V::VARCHAR | |----------------| | Adams, Douglas | | 42 | +----------------+