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

SQLServerでのEXCEPTのしくみ

    T-SQLのEXCEPTを使用できます SQL Serverの演算子を使用して、右側の入力クエリでは出力されない、左側の入力クエリから個別の行を返します。

    構文

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

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

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

    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     |
    +---------+-----------+

    EXCEPTを使用できます 演算子を使用して、右側の入力クエリでは出力されない、左側の入力クエリからの個別の行のみを返します。

    これが例です。

    SELECT CatName FROM Cats
    EXCEPT
    SELECT DogName FROM Dogs;

    結果:

    +-----------+
    | CatName   |
    |-----------|
    | Flutter   |
    | Scarcat   |
    +-----------+

    したがって、Catsに表示される値のみを取得します Dogsにも表示されないテーブル テーブル。前述のように、個別の行が返されるため、Flutterに対して返される行は1つだけです。 。

    切り替えてDogsを配置することもできます 左側の表とCats 右側にあります。

    SELECT DogName FROM Dogs
    EXCEPT
    SELECT CatName FROM Cats;

    結果:

    +-----------+
    | DogName   |
    |-----------|
    | Woofer    |
    | Yelp      |
    +-----------+

    EXCEPT 演算子はLEFT ANTI SEMI JOINとして表示されます 実行計画で。

    したがって、最初の例は次のようになります。

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

    結果:

    +-----------+
    | CatName   |
    |-----------|
    | Flutter   |
    | Scarcat   |
    +-----------+

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

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

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


    1. Postgresql:接続が拒否されました。ホスト名とポートが正しいこと、およびポストマスターがTCP/IP接続を受け入れていることを確認してください

    2. SQLServer2005と一時テーブルスコープ

    3. Psycopg2画像が見つかりません

    4. MySQLでスペースを含む列名を選択する方法