将另一个表中的逐行值转换为字符串,并将其插入SQL中的NOT IN子句

将另一个表中的逐行值转换为字符串,并将其插入SQL中的NOT IN子句,sql,sql-server,tsql,notin,Sql,Sql Server,Tsql,Notin,我试图通过使用NOT IN从“test\u user”表中排除一系列测试用户 我得到了另一个包含用户ID和其他信息的“成员”表 最初,tester user表并不太长,因此人们使用not IN子句通过列出测试用户的ID来排除测试用户,但随着测试用户的日益增加,我想知道是否有任何方法可以使此not IN()保持最新且易于维护 我不确定是否有以下解决方案: @declare test_user varchar(23) = select ID from test_user SELECT * FR

我试图通过使用
NOT IN
从“test\u user”表中排除一系列测试用户

我得到了另一个包含用户ID和其他信息的“成员”表

最初,tester user表并不太长,因此人们使用
not IN
子句通过列出测试用户的ID来排除测试用户,但随着测试用户的日益增加,我想知道是否有任何方法可以使此
not IN()
保持最新且易于维护

我不确定是否有以下解决方案:

@declare test_user varchar(23) = select ID from test_user

SELECT * FROM member WHERE ID NOT IN (@test_user)

谢谢你的帮助

您不需要变量。。。只需将您的查询直接插入
而不在
列表中即可

SELECT *
FROM member
WHERE ID NOT IN (SELECT ID FROM test_user);

注意:使用一致的大小写和布局进行查询会更方便。

您是否能够修改
成员表?如果是这样,您可以添加一个新列
is\u test\u user
。然后您可以使用

选择*
来自成员
其中是_test_user=0
如果您这样做,我建议也在
is\u test\u user
上添加索引

编辑:由于问题已经更新,我的答案不再合适


编辑2:根据波希米亚人的建议删除了索引建议。

您可以使用
不存在
,如下所示:

SELECT * FROM MEMBER M
WHERE NOT EXISTS 
  (SELECT 1 FROM TESTUSER T 
    WHERE T.ID = M.ID)
SELECT M.* 
  FROM MEMBER M LEFT JOIN TESTUSER T ON T.ID = M.ID
 WHERE T.ID IS NULL;
或者,您可以使用
左连接
,如下所示:

SELECT * FROM MEMBER M
WHERE NOT EXISTS 
  (SELECT 1 FROM TESTUSER T 
    WHERE T.ID = M.ID)
SELECT M.* 
  FROM MEMBER M LEFT JOIN TESTUSER T ON T.ID = M.ID
 WHERE T.ID IS NULL;

请不要将图像用于数据,而应将DDL+DML语句用于示例起始数据,并将格式化文本用于预期结果。不要过度考虑。除非性能严重下降,否则什么也不要做。谢谢你的评论。当您提到“DDL+DML”语句时,您是指CREATETABLE_名称(..)?对于预期的结果,你能分享一个例子吗?再次感谢!创建一个临时表,并插入样本数据——这样人们就可以复制和粘贴用于测试。预期结果可以是格式化文本。你应该自己做这件事,作为创建MRE的一部分——在构建MRE时解决你自己的问题并不少见。这里是@DaleK谢谢!我将在将来仿效这个例子。此外,您的解决方案也非常有效。非常感谢。由于缺少足够的基数,在布尔列上添加索引将没有效果。但是,如果id和is_test_user.hi Karn上都有一个覆盖索引,那么性能可能会有一点提高,很遗憾,我无法修改成员表。谢谢你的回复@波希米亚人谢谢你的建议。我假设测试用户的数量将是一个很小的百分比,其中索引可能是有用的。这可能正确,也可能不正确。在任何情况下,OP都不能修改成员表。您仍然需要一种保持表更新的方法,通常是触发器,这很容易使情况变得过于复杂。
左连接,其中NULL
几乎总是比直接反连接(您的第一个选项)性能差