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 子句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SQL IN 工作但 NOT IN 不起作用

Not in 子句不使用开放查询过滤 SQL Server

SQL Server:NOT IN in where 子句不能与 NVARCHAR 一起使用

在SQL Server中为什么不建议使用Not In子查询

Yii2 NOT IN条件不起作用

SQL Server 数据库中带有 Group by 子句的 JPQL 不起作用