Sql server MS SQL:不在中无法按预期工作:-(

Sql server MS SQL:不在中无法按预期工作:-(,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个奇怪的问题:-我有一个ID为1090的表-但是当我试图用一个sqlcommand将它从中排除时,比如WHERE something和md.vennenr NOT in SELECT FriendID from duplicate list,“NOT in”告诉我它不存在-即使它存在 我的完整存储过程如下所示: CREATE PROCEDURE [dbo].[DuplicateLevel3] @UserID INT AS DECLARE @MaxDubletNo int,

我有一个奇怪的问题:-我有一个ID为1090的表-但是当我试图用一个sqlcommand将它从中排除时,比如WHERE something和md.vennenr NOT in SELECT FriendID from duplicate list,“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;
我真的希望有人能帮我解决这个奇怪的问题。。。 当做 迈克尔

更新:

这些ID已由“第一次检查…”填写 但在“第二次检查”中,当CTE检查该值时,将找不到1090。
我可以通知您,我在本栏中没有任何空值。

正如我在评论中提到的,这很可能是因为您至少有一行FriendID的值为空。如果是这样,那么您的行为是预期的,并且:

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

使用NOT IN将对子查询值或表达式求反

⨂ 谨慎

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

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

创建表dbo.TableA I int NOT NULL; 创建表dbo.TableB I int NULL; 去 插入到dbo.TableA I中 值1,2,3,4,5; 去 插入dbo.TableB I 值3,空; 去 -不返回任何行 选择A.I 来自dbo.TableA 其中A.I不在dbo.TableB中选择B.I; 去 -返回行 选择A.I 来自dbo.TableA 其中A.I不在dbo.TableB中选择B.I,其中B.I不为空; 去 -返回行 挑选* 来自dbo.TableA 如果不存在,则从dbo.TableB中选择1,其中A.I=B.I; 去 DROP TABLE dbo.TableA; 删除表dbo.TableB;
打赌至少有1行FriendID的值为NULL。如果是,则它的工作方式与预期完全相同。Use NOT EXISTS NOT IN.NOT IN.没有问题,只需检查NULL:vennenr NOT IN从DuplicateForgetFriends中选择FriendID,其中ALevelNo=3,FriendID在中不为NULLsubquery@Larnu怎么可能不存在?花点时间给我们做一个wi强调最小值。根据你的“不存在”没有解决问题,这意味着问题不存在。@Larnu我已尽可能地将其最小化…感谢你的帮助-但我很抱歉:-它不起作用:-我尝试使用“不存在”但没有任何成功:-是时候获取一些样本数据和预期结果了,@MichaelEriksen,因为问题不在这里。我希望我能展示一些样本数据我没有添加一点样本数据-我希望它能进一步解释。。。
Table: DuplicateList has an int column FriendID:

FriendID
========
1089    
1090    
1091