SQL Serverでは、ALL
演算子をサブクエリとともに使用して、スカラー値をサブクエリによって返される単一列の値のセットと比較できます。
SELECT
も事実です 句とUNION
演算子は両方ともALL
を受け入れます ただし、この使用法には別の目的があります(結果セットでの重複を許可します)。
以下は、ALL
の使用例です。 サブクエリを持つ演算子。
例
2つのテーブルがあると仮定します。 Cats
およびDogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
次に、ALL
を使用してサブクエリを実行しましょう オペレーター。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
結果:
(0 rows affected)
この場合、行は返されませんでした。これは、ALL
が原因です すべてと積極的に比較するスカラー式が必要です サブクエリによって返される値。
この場合、サブクエリは非常に広範であるため、Dogs
のすべての行が テーブルが返されました。これには、各犬に同じ名前の対応する猫が少なくとも1匹いる必要があります。
サブクエリを少し変更しましょう。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
結果:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
この場合、サブクエリによって返されるすべての行のCats
に対応する行があるため、肯定的な結果が得られます。 テーブル(1行だけですが)。
反対側を返す
ALL
では任意の比較演算子を使用できます 。したがって、前の例を変更して、等しい演算子(=)を等しくない演算子(<>
のいずれか)に変更するだけで、反対の結果を返すことができます。 または非ISO標準!=
。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);
結果:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
したがって、サブクエリに対応する行があるすべての行を返す代わりに、ないすべての行を返します。 対応する行があります。
そして、他の例でも同じことができます。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
結果:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
エラー116?
ALL
を使用しているときにエラー116が発生した場合 、サブクエリで複数の列を選択していることが原因である可能性があります。 ALL
演算子は、結果セットが1列のサブクエリでのみ使用できます。
このエラーの原因の例を次に示します。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogId, DogName FROM Dogs);
サブクエリに列を追加しただけです。
ワイルドカード演算子を使用してサブクエリのすべての列を選択する場合、これは一般的なエラーです。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT * FROM Dogs);
いずれにせよ、結果は同じです:
Msg 116, Level 16, State 1, Line 5 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.