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

SQLServerのメッセージ512「サブクエリが複数の値を返しました」を修正

    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

    これに対処する1つの方法は、別の演算子を使用することです。つまり、 =以外の演算子を使用してください 、!=< <=> 、または> =

    INを使用する例を次に示します。 演算子:

    SELECT * FROM Dogs 
    WHERE DogName IN ( SELECT CatName FROM Cats );

    結果:

    +---------+-----------+
    | DogId   | DogName   |
    |---------+-----------|
    | 2       | Fluffy    |
    | 4       | Fluffy    |
    +---------+-----------+
    ソリューション2

    別のオプションは、等しい値を維持することです( = )演算子(または元のクエリに含まれる演算子)。ただし、サブクエリを変更します。

    equals演算子を使用したまま、サブクエリを変更する例を次に示します。

    SELECT * FROM Dogs 
    WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );

    結果:

    +---------+-----------+
    | DogId   | DogName   |
    |---------+-----------|
    | 2       | Fluffy    |
    | 4       | Fluffy    |
    +---------+-----------+

    この場合、サブクエリは1つの値のみを返し、equals演算子はそれで問題ありませんでした。

    ソリューション3

    上記のサブクエリは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が表示されます。


    1. SQLiteについて

    2. SQLトランザクションチュートリアル

    3. MySQL:コンマで区切られた単一行としての複数行

    4. SQL Developer 4