我有一个奇怪的问题:-(我有一张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;小提琴