メインコンテンツへスキップ
メインコンテンツへスキップ

UNION 句

UNION は、UNION ALL または UNION DISTINCT を明示的に指定して使用できます。

ALL または DISTINCT を指定しない場合は、union_default_mode 設定の値が使用されます。UNION ALLUNION DISTINCT の違いは、UNION DISTINCT が UNION の結果に対して重複排除(distinct 変換)を行う点であり、UNION ALL を含むサブクエリに対して SELECT DISTINCT を実行することと等価です。

UNION を使用して、結果を結合することで任意の数の SELECT クエリをまとめることができます。例:

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 では型キャストが行われます。たとえば、結合される 2 つのクエリで、互換性のある型に対して一方が非 Nullable 型、もう一方が Nullable 型の同じフィールドを持つ場合、結果の UNION ではそのフィールドは Nullable 型になります。

UNION の一部であるクエリは丸括弧で囲むことができます。ORDER BYLIMIT は最終結果に対してではなく、それぞれの個別クエリに対して適用されます。最終結果に対して変換処理を適用する必要がある場合は、UNION を用いたすべてのクエリを FROM 句内のサブクエリに含めることができます。

UNION ALL または UNION DISTINCT を明示的に指定せずに UNION を使用する場合は、union_default_mode 設定を使用して UNION のモードを指定できます。設定値としては ALLDISTINCT、または空文字列を指定できます。ただし、union_default_mode 設定を空文字列にした状態で UNION を使用すると、例外がスローされます。次の例は、設定値が異なる場合のクエリ結果を示します。

クエリ:

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 を構成する各クエリは同時に実行され、その結果はまとめてマージされます。

関連項目