为什么这在 sql server 2008 中没有给出任何记录?
;with pricedCategories as
(
select * from Product.Category where CategoryID not in
(select Parent_CategoryID from Product.Category)
)
select * from pricedCategories
为什么这在 sql server 2008 中没有给出任何记录?
;with pricedCategories as
(
select * from Product.Category where CategoryID not in
(select Parent_CategoryID from Product.Category)
)
select * from pricedCategories
当 CTE 内的子查询中有 NULL 值时,您的查询似乎不会返回值(如果我将 insert (1, NULL) 中的 NULL 替换为假设 (1, 0) 您的查询将起作用)。如果您想获取不是任何其他类别的父类别的类别,即使具有 NULL 值,您可以这样做:
DECLARE @Category TABLE (CategoryID INT, Parent_CategoryID INT)
INSERT @Category VALUES
(1, NULL),
(2, 1),
(3, 1),
(4, 2)
;WITH pricedCategories AS
(
SELECT * FROM @Category y WHERE NOT EXISTS
(SELECT Parent_CategoryID FROM @Category x
WHERE x.Parent_CategoryID = y.CategoryID)
)
SELECT * FROM pricedCategories
有趣的是,以下方法与您的问题中描述的方法相同:
;WITH pricedCategories AS
(
SELECT * FROM @Category y
WHERE y.CategoryID <> ALL(SELECT DISTINCT Parent_CategoryID FROM @Category)
)
SELECT * FROM pricedCategories
您可以更改查询以使用 ISNULL 函数将 NULL 替换为从未用作 CategoryID 的某个数值,如下所示:
;WITH pricedCategories AS
(
SELECT * FROM @Category WHERE CategoryID NOT IN
(SELECT ISNULL(Parent_CategoryID, -1) FROM @Category)
)
SELECT * FROM pricedCategories
但是随后表示“无”的 NULL 值将更改为 -1 的实际值,这是不正确的,您不应该使用它。