Sql server not in 子句不起作用
Posted
技术标签:
【中文标题】Sql server not in 子句不起作用【英文标题】:Sql server not in clause not working 【发布时间】:2012-07-07 09:58:39 【问题描述】:为什么这在 sql server 2008 中没有给出任何记录?
;with pricedCategories as
(
select * from Product.Category where CategoryID not in
(select Parent_CategoryID from Product.Category)
)
select * from pricedCategories
【问题讨论】:
【参考方案1】:当 CTE 内的子查询中有 NULL 值时,您的查询似乎不会返回值(如果我将插入 (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 的实际值,这是不正确的,您不应该使用它。
【讨论】:
我知道这种方法,但是我经常使用这种类型的查询,而且这种方法写起来不是那么直观和快速。它会吃掉你的大脑,但not in
不会。
@puretechy - 如果您想继续使用NOT IN
,只需从您的子查询中排除NULL
值。 IE。 where CategoryID not in (select Parent_CategoryID from Product.Category WHERE Parent_CategoryID IS NOT NULL)
以上是关于Sql server not in 子句不起作用的主要内容,如果未能解决你的问题,请参考以下文章