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

TransactSQLでNOTEXISTSではなくEXCEPTを使用する場合

    EXCEPT NULLを扱います 一致する値。

    このクエリ:

    WITH    q (value) AS
            (
            SELECT  NULL
            UNION ALL
            SELECT  1
            ),
            p (value) AS
            (
            SELECT  NULL
            UNION ALL
            SELECT  2
            )
    SELECT  *
    FROM    q
    WHERE   value NOT IN
            (
            SELECT  value
            FROM    p
            )
    

    空の行セットを返します。

    このクエリ:

    WITH    q (value) AS
            (
            SELECT  NULL
            UNION ALL
            SELECT  1
            ),
            p (value) AS
            (
            SELECT  NULL
            UNION ALL
            SELECT  2
            )
    SELECT  *
    FROM    q
    WHERE   NOT EXISTS
            (
            SELECT  NULL
            FROM    p
            WHERE   p.value = q.value
            )
    

    戻ります

    NULL
    1
    

    、そしてこれ:

    WITH    q (value) AS
            (
            SELECT  NULL
            UNION ALL
            SELECT  1
            ),
            p (value) AS
            (
            SELECT  NULL
            UNION ALL
            SELECT  2
            )
    SELECT  *
    FROM    q
    EXCEPT
    SELECT  *
    FROM    p
    

    戻ります:

    1
    

    EXCEPTでも再帰参照が許可されています 再帰的なCTEの句 、奇妙な動作をしますが、最後の行を除くすべてを返します。 前のセット全体ではなく、前のセット全体の:

    WITH    q (value) AS
            (
            SELECT  1
            UNION ALL
            SELECT  2
            UNION ALL
            SELECT  3
            ),
            rec (value) AS
            (
            SELECT  value
            FROM    q
            UNION ALL
            SELECT  *
            FROM    (
                    SELECT  value
                    FROM    q
                    EXCEPT
                    SELECT  value
                    FROM    rec
                    ) q2
            )
    SELECT  TOP 10 *
    FROM    rec
    
    ---
    1
    2
    3
    -- original set
    1
    2
    -- everything except the last row of the previous set, that is 3
    1
    3
    -- everything except the last row of the previous set, that is 2
    1
    2
    -- everything except the last row of the previous set, that is 3, etc.
    1
    

    SQL Server 開発者はそれを禁止するのを忘れたに違いありません。



    1. Android MVVMアーキテクチャのLiveDataリストから最初の要素または(任意の)要素を取得する方法は?

    2. SQLServerのワード関数に数値を書き込む方法

    3. PostgreSQL:大文字と小文字を区別しない文字列の比較

    4. トップ7データベース