UNION句
UNIONはUNION ALLまたはUNION DISTINCTを明示的に指定して使用できます。
ALLまたはDISTINCTを指定しない場合、union_default_mode設定に依存します。UNION ALLとUNION DISTINCTの違いは、UNION DISTINCTではUNIONの結果に対して重複排除変換が行われることです。これはUNION ALLを含むサブクエリからSELECT DISTINCTを行うことと同等です。
任意の数のSELECTクエリの結果を拡張して組み合わせるためにUNIONを使用できます。例:
SELECT CounterID, 1 AS table, toInt64(count()) AS c
FROM test.hits
GROUP BY CounterID
UNION ALL
SELECT CounterID, 2 AS table, sum(Sign) AS c
FROM test.visits
GROUP BY CounterID
HAVING c > 0
結果のカラムはそのインデックス(SELECT内の順序)に基づいて一致します。カラム名が一致しない場合、最終結果のカラム名は最初のクエリから取得されます。
Unionのために型キャストが行われます。たとえば、同じフィールドを持つ二つのクエリを結合する際に、そのフィールドが非Nullable型と互換性のあるNullable型の場合、結果のUNIONフィールドはNullable型になります。
UNIONの一部であるクエリを丸括弧で囲むことができます。ORDER BYやLIMITは、個別のクエリに適用され、最終結果には適用されません。最終結果に変換を適用する必要がある場合、すべてのクエリをUNIONでFROM句内のサブクエリに配置できます。
UNIONをUNION ALLまたはUNION DISTINCTを明示的に指定せずに使用する場合は、union_default_mode設定を使用してUnionモードを指定できます。設定値はALL、DISTINCT、または空文字列のいずれかです。しかし、UNIONをunion_default_mode設定で空文字列にすると、例外がスローされます。以下の例は、異なる設定値を持つクエリの結果を示しています。
クエリ:
SET union_default_mode = 'DISTINCT';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;
結果:
┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘
クエリ:
SET union_default_mode = 'ALL';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;
結果:
┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘
UNION/UNION ALL/UNION DISTINCTの一部であるクエリは同時に実行され、その結果を組み合わせることができます。
参照