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
डेवलपर्स इसे मना करना भूल गए होंगे।