sql >> Database >  >> RDS >> Sqlserver

Wanneer EXCEPT gebruiken in tegenstelling tot NOT EXISTS in Transact SQL?

EXCEPT behandelt NULL waarden als overeenkomend.

Deze vraag:

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
        )

retourneert een lege rijenset.

Deze vraag:

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
        )

zal terugkeren

NULL
1

, en deze:

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

zal terugkeren:

1

Recursieve verwijzing is ook toegestaan ​​in EXCEPT clausule in een recursieve CTE , hoewel het zich op een vreemde manier gedraagt:het geeft alles terug behalve de laatste rij van een vorige set, niet alles behalve de hele vorige set:

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 ontwikkelaars zijn vast vergeten het te verbieden.



  1. Controleer/wijzig het compatibiliteitsniveau van een database in SQL Server (SSMS)

  2. Een Microsoft Access-database migreren naar SQL Server

  3. Uitvoeren van ExecuteScalar() wanneer er geen resultaten worden geretourneerd

  4. Een beschadigde Access-database herstellen