SQLでは、 UNION
句は、2つのクエリの結果を1つの結果セットに連結します。
UNION
を使用できます ALL
の有無にかかわらず句 引数:
-
UNION ALL
–重複を含みます。 -
UNION
–重複を除外します。
以下は、それがどのように機能するかを示すためのいくつかの基本的な例です。
サンプルテーブル
2つのテーブルがあるとします: Cats
およびDogs
猫
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
犬
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
SELECT
を使用できます UNION
を含むステートメント 両方のテーブルの結果を1つの結果セットに結合する句。
UNION ALL
を使用した例
まず、 UNION ALL
を使用しましょう 重複が含まれるようにします。
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
結果:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
この場合、7行が返されます。 「フェッチ」が2回返されることがわかります。これは、Fetchという名前の犬が2匹いるためです。
同じ名前の猫と犬もいます:ふわふわ。
操作によって返されるフィールドに名前を付けるために列エイリアスを使用したことに注意してください。それを行わなかった場合、結果には最初のクエリの列名が使用されます。その場合、列ヘッダーは DogName
と呼ばれます。 PetName
の代わりに 。
SELECT DogName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
結果:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
これは、クエリで返すデータに応じて、受け入れられる場合と受け入れられない場合があります。私たちの場合、すべての結果が犬であるとは限らないため、適切ではありません。
UNION
を使用した例
ALL
を削除するとどうなるか見てみましょう 引数。
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
結果:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
今回は5行のみが返されます。両方の重複が削除されます。
UNION
vs DISTINCT
これは、 DISTINCT
を適用する場合とは異なることに注意してください。 個々のSELECT
に 声明。これを行うと、 ALL
が原因で、Fluffyが2回返されます。 SELECT
にのみ適用されます (連結された結果ではなく)適用されているというステートメント。
これが私が何を意味するかを説明するための例です。
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
結果:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
すべてのクエリは同じ数の列を返す必要があります
UNION
を使用する場合 句では、各クエリの列数は同じで、順序も同じである必要があります。
そうでない場合は、エラーが発生します。
SELECT CatName FROM Cats
UNION ALL
SELECT DogId, DogName FROM Dogs;
結果:
Msg 205, Level 16, State 1, Line 1 All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
これは、列の数が等しくない場合にSQLServerが返すエラーです。この特定のエラーは、同じ制限が INTERSECT
にも適用されることを示しています およびEXCEPT
演算子。表示されるエラーメッセージは、DBMSによって異なる場合があります。
データ型は互換性がなければなりません
同じ数の列を必要とすることに加えて、それらの列は互換性のあるデータ型を持っている必要があります。
必ずしも同じデータ型である必要はありませんが、互換性がある必要があります。つまり、暗黙的な変換を通じて互換性がなければなりません。データ型が一致しない場合、DBMSは、それらが一致するように暗黙的な変換を実行できる必要があります。
そうでない場合は、エラーが発生します。
SELECT CatName FROM Cats
UNION ALL
SELECT DogId FROM Dogs;
結果:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'Meow' to data type int.
結果の注文
ORDER BY
で結果を並べ替える場合 句、最後のクエリに配置する必要があります。別のORDERBY
を配置することはできません 各クエリの句、さらに言えば、最後のクエリではないクエリ。
SQLServerでこれを実行しようとすると発生するエラーは次のとおりです。
SELECT DogName AS PetName
FROM Dogs
ORDER BY DogName
UNION ALL
SELECT CatName
FROM Cats;
結果:
Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'UNION'.
したがって、結果を注文する場合は、次のようにする必要があります。
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
ORDER BY PetName;
UNION
を適用する 2つ以上のクエリへ
前の例では、2つの異なるクエリの結果を組み合わせましたが、さらに追加することを妨げるものは何もありません。必要に応じて、これを使用して多くのクエリの結果を組み合わせることができます。
たとえば、 Birds
もある場合 テーブル、これを行うことができます:
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
UNION ALL
SELECT BirdName
FROM Birds;
正規化
このページの例では、猫と犬を2つの別々のテーブルに配置しています。私がこれを行った理由は、 UNION
がどのようにUNION
であるかを明確かつ簡潔に説明するためです。 動作します。
実際には、これらは同じテーブルに Pets
と呼ばれる場合があります。 、次に別の PetTypes
テーブル(または同様のもの)。これは正規化と呼ばれ、リレーショナルデータベースが通常設計される方法です。
次に、これらのテーブルで結合を実行して、必要に応じてデータを返すことができます。