sql >> データベース >  >> RDS >> Sqlserver

SQLServerで「選択リストに指定できる式は1つだけ…」を修正する方法

    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);


    1. SQLServerのライセンスコストを削減

    2. MySQLに接続するようにTomcatを構成する方法

    3. postgreSQLで配列内部インデックスにアクセスする方法は?

    4. メモリ効率の高い組み込みのSqlAlchemyイテレータ/ジェネレータ?