SQL
UNION / UNION ALL
サーチ…
前書き
構文
- SELECT column_1 [、column_2] FROM table_1 [、table_2] [WHERE条件]
ユニオン| UNION ALL
SELECT column_1 [、column_2] FROM table_1 [、table_2] [WHERE条件]
備考
UNION
およびUNION ALL
句は、2つ以上の同一構造のSELECT文の結果セットを単一の結果/テーブルに結合します。
UNION
/ UNION ALL
が機能するためには、各クエリの列数と列の型が一致している必要があります。
UNION
とUNION ALL
問合せの違いは、 UNION
句がUNION ALL
にない結果の重複行を削除することです。
この明確なレコードの削除は、より最適化されたクエリーのために常に重複する(または気にしない)デフォルトが常にUNION ALL
にならないことがわかっている場合に、このために削除されるべき別個の行がなくても、クエリを著しく遅くする可能性があります。
基本的なUNION ALLクエリ
CREATE TABLE HR_EMPLOYEES
(
PersonID int,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
CREATE TABLE FINANCE_EMPLOYEES
(
PersonID INT,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
私たちが部門からすべてのmanagers
名前を抽出したいとしましょう。
UNION
を使用することで、 manager
position
を保持しているHR部門と財務部門のすべての従業員を得ることができます
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
UNION
ステートメントは、照会結果から重複行を除去します。両方の部門で同じ名前と位置を持つ人々を持つことが可能なので、重複を除去しないためにUNION ALL
を使用しています。
各出力列にエイリアスを使用する場合は、次のように最初のselect文にエイリアスを置くだけです。
SELECT
FirstName as 'First Name', LastName as 'Last Name'
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
簡単な説明と例
簡単な言葉で:
-
UNION
は2つの結果セットを結合し、結果セットから重複を除去します -
UNION ALL
は重複を削除しようとせずに2つの結果セットを結合します
多くの人が間違っているのは、重複を削除する必要がないときに
UNION
を使用することです。大規模な結果セットに対する追加のパフォーマンスコストは非常に重要です。
UNION
が必要な場合
2つの異なる属性に対して表をフィルタリングする必要があるとし、各列に対して別々の非クラスタ化インデックスを作成したとします。 UNION
使用すると、重複を防ぎながら両方のインデックスを活用できます。
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
これにより、これらのクエリを最適に実行するために単純なインデックスのみが必要となるため、パフォーマンスチューニングが簡単になります。ソーステーブルに対する全体的な書き込みパフォーマンスを向上させる、非クラスタ化インデックスの数をかなり少なくすることも可能です。
UNION ALL
が必要な場合
2つの属性に対してテーブルをフィルタリングする必要があるとしますが、重複レコードをフィルタリングする必要はありません(データモデルの設計上、ユニオン中にデータが重複して生成されることはないためです)。
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
これは、複数のテーブルに物理的に分割されるように設計されたデータを結合するビューを作成する場合(パフォーマンス上の理由から、レコードをロールアップしたい場合など)に特に便利です。データがすでに分割されているため、データベースエンジンで重複を削除すると値が追加されず、クエリに処理時間が追加されます。