MS SQL:NOT IN无法按预期工作:-(



我有一个奇怪的问题:-(我有一张ID为1090的表,但当我试图用像WHERE something AND md.vennenr NOT IN (SELECT FriendID FROM DuplicateList)这样的sql命令将其排除在外时,"NOT in"命令会告诉我它不存在,即使它存在!

我的完整存储过程如下所示:

CREATE PROCEDURE [dbo].[DuplicateLevel3] @UserID INT AS
DECLARE
@MaxDubletNo int,
@oldTime DateTime
WITH cte4 AS (
SELECT t.Upper_Fornavn    
FROM (
SELECT *
FROM Medlemsdata md
WHERE md.vennenr NOT IN (SELECT FriendID FROM DuplicateList)
) as t
)
INSERT INTO DuplicateList (FriendID)
SELECT md.Vennenr
FROM Medlemsdata md;

我真的希望有人能帮我解决这个奇怪的问题
致问候,
Michael

更新:

Table: DuplicateList has an int column FriendID:
FriendID
========
1089    
1090    
1091    

这些ID已由"第一次检查…"填写
但在"第二次检查"中,CTE在检查此值时找不到1090
我可以通知您,我在这一列中没有任何NULL值。

正如我在评论中提到的,这很可能是因为至少有一行的FriendID值与NULL值相同。如果是这样的话,那么你的行为是意料之中的,并且是有记录的:

结果值

如果test_expression的值等于子查询返回的任何值,或者等于逗号分隔列表中的任何表达式,则结果值为TRUE;否则,结果值为FALSE。

使用NOT IN否定子查询值或表达式。

⨂注意

使用IN或NOT IN与test_expression进行比较的子查询或表达式返回的任何空值都将返回UNKNOWN。将null值与in或NOT in一起使用可能会产生意外的结果。

相反,我更喜欢使用NOT EXISTS,因为它没有相同的功能。或者,正如Lukasz所建议的,您可以将WHERE添加到子查询中:

CREATE TABLE dbo.TableA (I int NOT NULL);
CREATE TABLE dbo.TableB (I int NULL);
GO
INSERT INTO dbo.TableA (I)
VALUES(1),(2),(3),(4),(5);
GO
INSERT INTO dbo.TableB (I)
VALUES(3),(NULL);
GO
--Returns no rows
SELECT A.I 
FROM dbo.TableA A
WHERE A.I NOT IN (SELECT B.I FROM dbo.TableB B);
GO
--Returns Rows
SELECT A.I 
FROM dbo.TableA A
WHERE A.I NOT IN (SELECT B.I FROM dbo.TableB B WHERE B.I IS NOT NULL);
GO
--Returns Rows
SELECT *
FROM dbo.TableA A
WHERE NOT EXISTS (SELECT 1 FROM dbo.TableB B WHERE A.I = B.I);
GO
DROP TABLE dbo.TableA;
DROP TABLE dbo.TableB;

db<gt;小提琴

最新更新