SQLServerで「サブクエリが複数の値を返しました…」というエラーメッセージ512が表示された場合は、これが許可されていないシナリオで複数の値を返すサブクエリを使用しているためです。
次の2つのテーブルがあるとします。
SELECT * FROM Dogs;
SELECT * FROM Cats;
結果:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 4 | Fluffy | +---------+-----------+ +---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
そして、これら2つのテーブルに対して次のクエリを実行します。
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats );
結果:
Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
エラーメッセージ512が発生したことがわかります。
このエラーメッセージは、「サブクエリが複数の値を返した」こと、および「サブクエリが=、!=、<、<=、>、> =の後に続く場合、またはサブクエリが式として使用されている場合、これは許可されないことを明示的に示しています。 」。
これに対する解決策は、クエリで何をしようとしているかによって異なります。以下は、この問題を解決するためのいくつかのオプションです。
これに対処する1つの方法は、別の演算子を使用することです。つまり、 =
以外の演算子を使用してください 、!=
、<
、
<=
、>コード> 、または
> =
。
IN
を使用する例を次に示します。 演算子:
SELECT * FROM Dogs
WHERE DogName IN ( SELECT CatName FROM Cats );
結果:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
別のオプションは、等しい値を維持することです( =
)演算子(または元のクエリに含まれる演算子)。ただし、サブクエリを変更します。
equals演算子を使用したまま、サブクエリを変更する例を次に示します。
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );
結果:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
この場合、サブクエリは1つの値のみを返し、equals演算子はそれで問題ありませんでした。
上記のサブクエリは1つの列のみを返すことに注意してください。サブクエリが複数の列を返した場合は、 EXISTS
を使用するように外部クエリを変更する必要があります オペレーター。
例:
SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );
結果:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
EXISTS
を使用するように変更しなかった場合 演算子の場合、おそらくエラーメッセージ116が表示されます。