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

SQLServerでALLを使用する3つの方法

    あなたはALLに精通しているかもしれません SQLServerのオプション。おそらく、 UNIONと一緒に使用したことがあるでしょう。 結果セットに返される可能性のある重複を含めるための演算子。

    しかし、あなたはその ALL を知っていましたか? 他の2つのコンテキストでも使用できますか?

    ALL 次の3つのコンテキストで使用できます:

    • SELECTの引数として 条項。
    • UNIONへの引数として 条項。
    • スカラー値を単一列の値のセットと比較するときの論理演算子として。

    これらの各コンテキストの例を次に示します。

    すべて SELECTで 条項

    SELECTと一緒に使用する場合 句、 ALL 結果セットに重複する値が返されることを指定します。

    おそらく、知らないうちに暗黙のうちにこれを使用しているでしょう。

    T-SQLでは、 SELECTの構文 句は次のようになります:

    SELECT [ ALL | DISTINCT ]  
    [ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]   
    <select_list>   
    <select_list> ::=   
        {   
          *   
          | { table_name | view_name | table_alias }.*   
          | {  
              [ { table_name | view_name | table_alias }. ]  
                   { column_name | $IDENTITY | $ROWGUID }   
              | udt_column_name [ { . | :: } { { property_name | field_name }   
                | method_name ( argument [ ,...n] ) } ]  
              | expression  
              [ [ AS ] column_alias ]   
             }  
          | column_alias = expression   
        } [ ,...n ]

    [ALL|に行く部分DISTINCT] ALLから選択できることを意味します およびDISTINCT

    角括弧は、この部分がオプションであることを意味します。

    • すべて 重複する行が結果セットに表示される可能性があることを指定します。
    • DISTINCT 結果セットに表示できるのは一意の行のみであることを指定します。

    ALL はデフォルト値であるため、 ALLを指定しない場合 またはDISTINCT ALL 使用されます。

    したがって、次の2つのステートメントは同等です。

    SELECT DogName 
    FROM Dogs;
    
    SELECT ALL DogName 
    FROM Dogs;

    結果の例:

    +-----------+
    | DogName   |
    |-----------|
    | Fetch     |
    | Fluffy    |
    | Wag       |
    | Fetch     |
    +-----------+
    (4 rows affected)
    +-----------+
    | DogName   |
    |-----------|
    | Fetch     |
    | Fluffy    |
    | Wag       |
    | Fetch     |
    +-----------+
    (4 rows affected)

    どちらの結果も、「Fetch」という名前の犬が2匹いることを示しています。

    ALLを交換した場合 DISTINCTの引数 、「フェッチ」の場合は1行のみが返されます。これは、 DISTINCT 結果セットから重複する値を削除します。

    SELECT DISTINCT DogName 
    FROM Dogs;

    結果の例:

    +-----------+
    | DogName   |
    |-----------|
    | Fetch     |
    | Fluffy    |
    | Wag       |
    +-----------+
    (3 rows affected)

    すべて UNIONで 条項

    ALL UNIONで使用した場合も同じことを行います 句。結果セットに重複する値が返されることを指定します。

    しかし、明らかに、 UNION SELECTとは別の句です 、したがって、コンテキストは少し異なります。

    UNION 句は、2つのクエリの結果を1つの結果セットに連結します。 ALLの有無にかかわらず使用できます 引数:

    • UNION ALL –重複を含みます。
    • UNION –重複を除外します。

    UNION ALLの使用例を次に示します。 2つのクエリを組み合わせる。

    Catsというテーブルを追加しましょう 。したがって、2つのテーブルがあります: Dogs およびCats

    +---------+-----------+
    | DogId   | DogName   |
    |---------+-----------|
    | 1       | Fetch     |
    | 2       | Fluffy    |
    | 3       | Wag       |
    | 1002    | Fetch     |
    +---------+-----------+

    +---------+-----------+
    | CatId   | CatName   |
    |---------+-----------|
    | 1       | Meow      |
    | 2       | Fluffy    |
    | 3       | Scratch   |
    +---------+-----------+

    次に、各テーブルから犬/猫の名前を選択し、 UNION ALLを使用します。 両方のテーブルの結果を結合します。

    SELECT DogName AS PetName
    FROM Dogs
    UNION ALL
    SELECT CatName
    FROM Cats;

    結果:

    +-----------+
    | PetName   |
    |-----------|
    | Fetch     |
    | Fluffy    |
    | Wag       |
    | Fetch     |
    | Meow      |
    | Fluffy    |
    | Scratch   |
    +-----------+
    (7 rows affected)

    この場合、7行が返されます。 「フェッチ」が2回返されることがわかります。これは、Fetchという名前の犬が2匹いるためです。

    同じ名前の猫と犬もいます:ふわふわ。 (前の例ではFluffyという犬が1匹しかいなかったので、もう1匹は猫だとわかります)。

    ALLを削除するとどうなるか見てみましょう 引数。

    SELECT DogName AS PetName
    FROM Dogs
    UNION
    SELECT CatName
    FROM Cats;

    結果:

    +-----------+
    | PetName   |
    |-----------|
    | Fetch     |
    | Fluffy    |
    | Meow      |
    | Scratch   |
    | Wag       |
    +-----------+
    (5 rows affected)

    今回は5行のみが返されます。両方の重複が削除されます。

    これは、 DISTINCTを適用する場合とは異なることに注意してください。 個々のSELECTに 声明。これを行うと、 ALL が原因で、Fluffyが2回返されます。 SELECTにのみ適用されます (連結された結果ではなく)適用されているというステートメント。

    これが私が何を意味するかを説明するための例です。

    SELECT DISTINCT DogName AS PetName
    FROM Dogs
    UNION ALL
    SELECT DISTINCT CatName
    FROM Cats;

    結果:

    +-----------+
    | PetName   |
    |-----------|
    | Fetch     |
    | Fluffy    |
    | Wag       |
    | Fluffy    |
    | Meow      |
    | Scratch   |
    +-----------+
    (6 rows affected)

    すべて オペレーター

    ALL 演算子をサブクエリとともに使用して、スカラー値をサブクエリによって返される単一列の値のセットと比較できます。

    復習として、ここに2つの表があります:

    +---------+-----------+
    | DogId   | DogName   |
    |---------+-----------|
    | 1       | Fetch     |
    | 2       | Fluffy    |
    | 3       | Wag       |
    | 1002    | Fetch     |
    +---------+-----------+

    +---------+-----------+
    | CatId   | CatName   |
    |---------+-----------|
    | 1       | Meow      |
    | 2       | Fluffy    |
    | 3       | Scratch   |
    +---------+-----------+

    次に、 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行のみ)。


    1. MHAに関する主な一般的な問題とその修正方法

    2. SQLで行に番号を付ける方法

    3. AzureポータルでLinux上のSQLServer2017の使用を開始する

    4. PostgreSQLのMAX()関数