SQL Serverでは、EXISTS
を導入せずにサブクエリで複数の列を選択しようとすると、エラーメッセージ116が発生します。 オペレーター。
完全なエラーは次のようになります:
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.
例
このエラーを生成するクエリの例を次に示します。
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (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.
このクエリの問題は、サブクエリがアスタリスク(*
)を使用することです。 )Dogs
からすべての列を選択します テーブル。そのテーブルには複数の列があるため、エラーが発生します。
エラーを修正する方法
上記のエラーはいくつかの方法で修正できます。
これを修正する1つの方法は、アスタリスク(*
)を置き換えることです。 )サブクエリに単一の列名を使用する:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
これは、サブクエリがテーブル内のすべての列ではなく、1つの列のみを返すようになったことを意味します。
これを修正する別の方法は、エラーメッセージが示唆することを実行し、EXISTS
を使用することです。 IN
の代わりに演算子 。
これを行うには、クエリの構成にわずかなバリエーションが必要です:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
ご想像のとおり、EXISTS
1つの列のみを明示的に指定した場合でも、演算子は機能します:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
ただし、IN
とは対照的です 演算子、EXISTS
サブクエリで複数の列名を明示的に選択した場合にも機能します:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);