sql >> Database teknologi >  >> RDS >> Sqlserver

Hvornår skal man bruge UNDTAGET i modsætning til IKKE FINDER i Transact SQL?

EXCEPT behandler NULL værdier som matchende.

Denne forespørgsel:

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
        )
 

returnerer et tomt rækkesæt.

Denne forespørgsel:

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 )

vender tilbage

NULL
1
 

, og denne:

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
 

vil returnere:

1
 

Rekursiv reference er også tilladt i EXCEPT klausul i en rekursiv CTE , selvom den opfører sig på en mærkelig måde:den returnerer alt undtagen sidste række af et tidligere sæt, ikke alt undtagen hele det forrige sæt:

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 udviklere må bare have glemt at forbyde det.



  1. Sådan installeres den seneste version af Sqlite aar, når du bruger Room On Android

  2. Hvordan returnerer man flere værdier i én kolonne (T-SQL)?

  3. Umuligt at installere PG gem på min mac med Mavericks

  4. Den lagrede procedure for at få instansindstillingerne