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

SQLServerALLオペレーターの説明

    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.


    1. SQL Server:プールされた接続間での分離レベルのリーク

    2. UPDLOCK、HOLDLOCKについて混乱している

    3. oracle12c-文字が最後に出現した後の文字列を選択します

    4. いつカーソルとデータベースを閉じる必要がありますか?