Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Khi nào sử dụng EXCEPT thay vì NOT EXISTS trong Transact SQL?

EXCEPT xử lý NULL các giá trị phù hợp.

Truy vấn này:

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
        )

sẽ trả về một tập hợp hàng trống.

Truy vấn này:

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
        )

sẽ trở lại

NULL
1

và cái này:

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

sẽ trở lại:

1

Tham chiếu đệ quy cũng được phép trong EXCEPT mệnh đề trong CTE đệ quy , mặc dù nó hoạt động theo một cách kỳ lạ:nó trả về mọi thứ ngoại trừ hàng cuối cùng của tập hợp trước đó, không phải tất cả mọi thứ ngoại trừ toàn bộ tập hợp trước đó:

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 các nhà phát triển chắc hẳn đã quên cấm nó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LEFT () so với SUBSTRING () trong SQL Server:Sự khác biệt là gì?

  2. Có ảnh hưởng nghiêm trọng đến hiệu suất khi sử dụng Khóa ngoại trong SQL Server không?

  3. Tùy chỉnh cảnh báo đám mây Spotlight

  4. Cách chuyển đổi giữa các định dạng ngày trong SQL Server bằng CAST ()

  5. Hiệu suất máy chủ SQL TOP truy vấn CPU -2