Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Kiedy używać EXCEPT w przeciwieństwie do NOT EXISTS w Transact SQL?

EXCEPT traktuje NULL wartości jako pasujące.

To zapytanie:

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
        )

zwróci pusty zestaw wierszy.

To zapytanie:

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
        )

wróci

NULL
1

, a ten:

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

powróci:

1

Odwołanie rekurencyjne jest również dozwolone w EXCEPT klauzula w rekurencyjnym CTE , chociaż zachowuje się w dziwny sposób:zwraca wszystko oprócz ostatniego wiersza poprzedniego zestawu, nie wszystko oprócz całego poprzedniego zestawu:

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 programiści musieli po prostu zapomnieć o zakazie tego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Unpivot z nazwą kolumny

  2. VMware CPU Hot Plug vNUMA Wpływ na SQL Server

  3. 4 sposoby sprawdzenia, czy tabela istnieje przed upuszczeniem jej w SQL Server (T-SQL)

  4. Utwórz kolumnę wyliczaną przy użyciu danych z innej tabeli

  5. OR nie jest obsługiwany z instrukcją CASE w SQL Server