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
、この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
それは奇妙な方法で振る舞うものの
再帰参照はまた、再帰CTE
にEXCEPT
句では許可されています
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
開発者は、これを禁止することを忘れてしまったばかりです。
参考:http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs -left-join-is-null-sql-server/ –
@rexem:参照でEXCEPT句が決して言及されていません... –
いいえ、しかしそれは存在しないことについて話しますパフォーマンス。このサイトは、dbのパフォーマンスに関する関連する質問の優れた参考資料です。 –