1

为什么这在 sql server 2008 中没有给出任何记录?

;with pricedCategories as
(
    select * from Product.Category where CategoryID not in
    (select Parent_CategoryID from Product.Category)
)
select * from pricedCategories
4

1 回答 1

3

当 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 的实际值,这是不正确的,您不应该使用它。

于 2012-07-07T10:10:27.140 回答