我有一个拥有数千名客户的数据库。他们都有唯一的客户ID。
从另一个不同的系统我收到了一个客户ID列表,我想知道在我的数据库中找不到哪些ID。
我的查询目前是这样的
select ID
from table
where ID in ('A1', 'A2', 'A3', ... 'A6499', 'A6500')
从搜索条件中,如何将不匹配的搜索值添加到结果集中? 如果搜索条件数据已存在于同一数据库中,我知道如何执行此操作。除了制作临时表并加入它之外还有其他选择吗?
我的数据库将包含比A6500更多的值,例如A7500。我不想在结果集中获得此值。
答案 0 :(得分:5)
您可以使用Table Value Constructor:
SELECT t.ID
FROM (VALUES ('A1'), ('A2'), ('A3')) AS t(ID)
LEFT JOIN table ON t.ID = table.ID
WHERE table.ID IS NULL
或者如果你用逗号分隔的字符串使用string_split
(2016+)或者为较低版本分割udf的字符串 - 我推荐Jeff Moden的DelimitedSplit8K:
SELECT value
FROM STRING_SPLIT('A1,A2,A3', ',') AS t
LEFT JOIN table ON t.value = table.ID
WHERE table.ID IS NULL
答案 1 :(得分:1)
使用明确的VALUES
,您可以编写超过1000个值,即IN
限制。
;WITH OtherDatabaseIDs AS
(
SELECT
V.*
FROM
(VALUES
(1000),
--... as many records as you want
(2500)) V(OtherDatabaseID)
)
SELECT
*
FROM
OtherDatabaseIDs AS T
WHERE
NOT EXISTS (SELECT 1 FROM table AS O WHERE T.OtherDatabaseID = O.ID)