UNION 句

演算子 UNION では、2 つのクエリの結果を、両方のクエリのすべての行を収めた 1 つの結果セットに結合します。

SQL 標準のルールでは以下が定義されています。

  • UNION に関与する各クエリの列の数と順序は互いに同じであることが必要です。

  • 各フィールドのデータ型には整合性があることが必要です。

  • UNION では重複行が返されません。重複行があれば削除されます。重複行を維持する場合は UNION ALL を使用する必要があります。

Denodo には、次の 2 種類の UNION 操作が存在します。

  • SQL UNION: この操作は、SQL の標準和結合演算子に準拠しています。

  • EXTENDED UNION: EXTENDED UNION 演算子の動作は SQL 標準とは以下の点で異なります。

    • クエリのフィールドのアソシエーションは、位置ではなく名前に基づいて実行されます。

    • あるクエリに存在するフィールドが別のクエリに存在しない場合でも、UNION は実行されます。このようなフィールドは結果セットにも追加されます。クエリの行のうち、フィールドが返されない行では、そのフィールドの値は null になります。

    • Denodo の UNION 演算子では重複行が削除されません (UNION ALL の動作と同様)。重複行を削除する場合は DISTINCT 句を追加します。

SQL UNION 構文および SQL UNION ALL 構文 (標準の SQL UNION の場合) と EXTENDED UNION ALL 構文 (拡張和結合の場合) を明示的に使用すると、クエリでのUNION 操作の種類を指定できます。

Denodo 8 以降、ANSI SQL 構文の UNION [DISTINCT]UNION ALL が SQL UNION 操作のデフォルトに設定されています。これが、ANSI SQL 構文が拡張和結合のデフォルトに設定されていた以前のバージョンとの違いです。このデフォルトのマッピングを変更して、ANSI SQL 構文が拡張和結合にマッピングされるように設定できます。UNION 句が拡張和結合として動作するように設定するには、以下の手順に従って実施してください。

  1. 管理者アカウントで管理ツールにログインします。

  2. VQL シェルを開き、以下のコマンドを実行します。

    SET 'com.denodo.vdb.union.enableStandardSQLUnion' = 'false';
    

    この変更を適用するために Virtual DataPort サーバーを再起動する必要はありません。変更は直ちに適用されます。

最終的に、SQL UNION、SQL UNION ALL、EXTENDED UNION ALL を使用することによるパフォーマンスに対する影響を考慮する必要があります。どのデータベースでも Denodo でも、UNION の重複行を削除する処理にはコストがかかります。実行エンジンは、重複行をすぐに返すのではなく、UNION の結果行をすべて評価して重複を検出する必要があるからです。

UNION の各ブランチから返されるすべての行が一意であることがわかっている場合は、SQL UNION の代わりに SQL UNION ALL または EXTENDED UNION ALL を実行します。この方が、クエリが迅速に実行されます。