如何让SQL在结果中显示无与伦比的标准?

时间:2018-03-15 14:45:13

标签: sql sql-server

我有一个拥有数千名客户的数据库。他们都有唯一的客户ID。

从另一个不同的系统我收到了一个客户ID列表,我想知道在我的数据库中找不到哪些ID。

我的查询目前是这样的

select ID
from table
where ID in ('A1', 'A2', 'A3', ... 'A6499', 'A6500')

从搜索条件中,如何将不匹配的搜索值添加到结果集中? 如果搜索条件数据已存在于同一数据库中,我知道如何执行此操作。除了制作临时表并加入它之外还有其他选择吗?

我的数据库将包含比A6500更多的值,例如A7500。我不想在结果集中获得此值。

2 个答案:

答案 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)