sql >> Databasteknik >  >> RDS >> Sqlserver

När ska man använda UTOM i motsats till INTE FINNS i Transact SQL?

EXCEPT behandlar NULL värden som matchande.

Denna fråga:

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
        )

returnerar en tom raduppsättning.

Denna fråga:

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
        )

kommer tillbaka

NULL
1

, och den här:

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

kommer att returnera:

1

Rekursiv referens är också tillåten i EXCEPT sats i en rekursiv CTE , även om det beter sig på ett konstigt sätt:det returnerar allt utom den sista raden av en tidigare uppsättning, inte allt förutom hela föregående uppsättning:

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 utvecklare måste bara ha glömt att förbjuda det.



  1. 3 sätt att extrahera månaden från ett datum i SQL Server (T-SQL)

  2. Hur man importerar XML-fil till MySQL-databastabell med XML_LOAD(); fungera

  3. Bästa sättet att infoga flera rader i Oracle?

  4. Hur konverterar man effektivt text till nummer i Oracle PL/SQL med icke-standard NLS_NUMERIC_CHARACTERS?