查找IN表达式中不存在记录的id

时间:2016-06-08 11:08:38

标签: sql-server tsql

任何人都可以帮我解决如何解决我偶尔遇到的常见问题,但往往会解决这个问题吗?我试图找到一种优雅的方法来识别在给定大量值列表的情况下表中不存在Id。

我已经获得了一张包含4000多个字符串ID列表的Excel表格,我需要确定哪些不存在于SQL Server表中。

我的第一个动作是使用Notepad ++并将列表转换为类似于'XX1','XX2','XX3'等的CSV列表,并运行SELECT * FROM [TABLE] WHERE [ID] IN('XX1 ”, 'XX2', 'XX3',...)。这比Excel中显示的记录少2,所以现在我需要对它们进行筛选,以确定哪两个不在数据库中。

感谢您的帮助。

保罗。

3 个答案:

答案 0 :(得分:2)

您可以加入使用表值构造函数生成的内联表,只要它不会溢出那么多id,在这种情况下您需要将它们转储到表中。

根据the documentation,一个VALUES表达式中的行数限制为1000:

  

通过直接在VALUES列表中插入行可以构造的最大行数是1000

要与内联表联接,请使用以下语法:

INNER JOIN (VALUES (1), (2), ...) AS inline (id)

以下是一个示例,使用此表(您的实际表格):

CREATE TABLE databasetable (ID INT NOT NULL)
INSERT INTO databasetable VALUES (1), (2), (3), (5), (6), (8), (9), (10)

您可以像这样查询缺失值:

SELECT
    excel.id
FROM
    databasetable AS A
    RIGHT JOIN (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)) AS excel (id)
        ON A.id = excel.id
WHERE
    A.id IS NULL

因此,您必须从Excel电子表格中生成VALUES (1), (2), (3), ...)

要使用临时表,如果行数超过1000行:

DECLARE @EXCEL TABLE (ID INT)
INSERT INTO @EXCEL VALUES (1), (2), (3), ..... -- first 1000
INSERT INTO @EXCEL VALUES (1), (2), (3), ..... -- next 1000
INSERT INTO ...                                -- and so on

SELECT
    @excel.id
FROM
    databasetable AS A
    RIGHT JOIN @excel
        ON A.id = @excel.id
WHERE
    A.id IS NULL

答案 1 :(得分:1)

只需几个演示即可添加到可能性中

通过表变量。
这次使用NOT IN子句:

DECLARE @varTbl TABLE(ID varchar(8));

insert into @varTbl values ('XX1'),('XX2');

select id from @varTbl 
where id not in (select distinct id from [SomeTable]);

通过仅在会话期间存在的临时表 这次是LEFT JOIN。

CREATE TABLE #tempTbl (ID varchar(8));

insert into #tempTbl values ('XX1'),('XX2');

select tmp.id 
from #tempTbl tmp
left join [SomeTable] t on (tmp.id = t.id)
where t.id is null
group by tmp.id
order by tmp.id;

另一种完全不同的方法是比较via文件。 您首先将参考数据的ID和目标表中的ID导出到已排序的文本文件。然后筛选出参考数据中存在但不存在于目标表中的行的差异 在Windows上,您可以通过PowerShell执行此操作。

$ref = Get-Content WhatShouldBe.txt
$dest = Get-Content WhatIsNow.txt

Compare-Object $ref $dest |Where-Object {$_.SideIndicator -eq "<="} |Select -ExpandProperty InputObject > WhatCanBeAdded.txt

答案 2 :(得分:1)

相信你可以在数据库中创建表格

如果您要获取Excel工作表或电子邮件中的文件,请将内容移至excel表(如果是电子邮件)或使用导入数据向导直接导入Excel工作表到登台表 之后,您可以轻松地比较登台表和原始表中的数据,这比在表变量或#temp表中加载id要容易得多。 该视频演示了如何将Excel数据导入sql server https://www.youtube.com/watch?v=Z1vqhYlwcyA

还要随机检查是否填充了所有值,或者是否也插入了任何NULL值。

使用IN子句添加的另一件事可能有数千个值 可以抛出错误。请在SO中查看此页面 "IN" clause limitation in Sql Server