Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Кога да се използва EXCEPT вместо NOT EXISTS в Transact SQL?

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавете IIS 7 AppPool Identities като входове в SQL Server

  2. Вмъкнете картина в полето за изображение на SQL Server 2005, като използвате само SQL

  3. Производителност на SQL сървър TOP CPU заявка -1

  4. Как мога да изброя всички външни ключове, препращащи към дадена таблица в SQL Server?

  5. Разбиране на проблема с мръсното четене със SQL Server