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

SQLServerでのINTERSECTのしくみ

    SQL Serverでは、T-SQL INTERSECTを使用できます。 左右両方の入力クエリによって出力される個別の行を返す演算子。

    構文

    構文は次のようになります:

    { <query_specification> | ( <query_expression> ) }   
    { INTERSECT }  
    { <query_specification> | ( <query_expression> ) }

    実際、MicrosoftのドキュメントにはEXCEPTが含まれています 同じ構文がINTERSECTに適用されるため、その定義では演算子 およびEXCEPT

    Microsoftの構文は次のようになります:

    { <query_specification> | ( <query_expression> ) }   
    { EXCEPT | INTERSECT }  
    { <query_specification> | ( <query_expression> ) }

    2つのテーブルがあると想像してください。 Cats およびDogs

    Cats

    +---------+-----------+
    | CatId   | CatName   |
    |---------+-----------|
    | 1       | Brush     |
    | 2       | Scarcat   |
    | 3       | Flutter   |
    | 4       | Flutter   |
    +---------+-----------+

    Dogs

    +---------+-----------+
    | DogId   | DogName   |
    |---------+-----------|
    | 1       | Yelp      |
    | 2       | Woofer    |
    | 3       | Brush     |
    | 4       | Brush     |
    +---------+-----------+

    Brushという猫がいて、Brushという犬も2匹いることに注意してください。

    INTERSECTを使用できます 演算子は、左と右の両方の入力クエリによって出力される個別の行のみを返します。

    つまり、両方のテーブルに表示されるすべての値を返しますが、(複数の行がある場合でも)1つの行のみを返します。したがって、この場合はBrushを返します。 。

    やってみましょう。

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

    結果:

    Brush

    前述のように、個別の行が返されるため、この場合は1つの行のみが返されます。

    これはLEFT SEMI JOINとして表示されます 実行計画で。

    次のようにするのと似ています:

    SELECT 
        DISTINCT CatName
    FROM Cats c 
    WHERE EXISTS (SELECT DogName FROM Dogs d
    WHERE c.CatName = d.DogName);

    結果:

    Brush

    INTERSECTを使用する場合は注意してください 、列の数と順序は、すべてのクエリで同じである必要があります。また、データ型には互換性がなければなりません。それらは実際には同じである必要はありませんが、暗黙の変換によって比較可能である必要があります。

    また、DISTINCTを決定するために列の値を比較する場合 行、2つのNULL 値は等しいと見なされます。

    INTERSECTを使用する場合 分散クエリでは、ローカルサーバーでのみ実行され、リンクサーバーにはプッシュされないため、パフォーマンスに影響を与える可能性があることに注意してください。


    1. php、mysql、jquery、ajaxを使用してdivスクロールにデータを動的にロードする

    2. PostgreSQLは部分インデックスを使用しません

    3. SQLServerの結果セットで返される列のデータ型を確認する

    4. CentOS / RHEL7およびDebian8/9でMariaDB(マスタースレーブ)レプリケーションをセットアップする方法