サーチ…


前書き

SQLのUNIONキーワードは、重複のないSELECT文の結果と結合するために使用されます。 UNIONを使用して結果を結合するには、両方のSELECT文が同じ順序で同じデータ型の列を持つ必要がありますが、列の長さは異なる場合があります。

構文

  • 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が機能するためには、各クエリの列数と列の型が一致している必要があります。

UNIONUNION 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

これは、複数のテーブルに物理的に分割されるように設計されたデータを結合するビューを作成する場合(パフォーマンス上の理由から、レコードをロールアップしたい場合など)に特に便利です。データがすでに分割されているため、データベースエンジンで重複を削除すると値が追加されず、クエリに処理時間が追加されます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow