在数据库数据中找不到时从预定义数据返回的SQL查询
本文关键字:数据 返回 SQL 预定义 查询 数据库 找不到 | 更新日期: 2023-09-27 18:13:58
我需要一些帮助来理解下面的事情。
我有一个预定义的ID号码列表,我们称之为Alias
,我从CSV文件中获得。我要做的是将该列表与数据库进行比较,找出哪些存在于CSV中,而不存在于SQL数据库中。
第一件事是我不确定如何定义一个列表,说1,2,3,4,5
作为一个表,列名为Alias
,这样我就可以加入/选择。
其次,您将如何编写这个查询?我正在考虑必须像下面这样组织它:
SELECT * FROM (1,2,3,4,5) WHERE Alias NOT IN (
SELECT Alias FROM table1 WHERE Alias IN (1,2,3,4,5));
我知道这个查询不会工作,把它想象成伪代码,但即使这样的事情是工作的,写两次列表可能会被证明是麻烦的(我可以在列表中有超过50K的别名),而且很可能是非常低效的。
谢谢你的建议!
喝了杯咖啡,休息了一会儿,我想我有了最好的解决办法。
考虑到这将是一个存储过程,存储过程将执行以下操作:
- 创建
TempTable
,如果不存在,则截断 INSERT (CSVList) INTO -
SELECT Alias FROM TempTable WHERE Alias NOT IN (SELECT Alias FROM MainTable)
TempTable
这样我就可以将列表指定为一个表,并且只从中选择一次:)
假设T
表中有CSV值(逗号分隔),T1
是您的MainTable。那么下面的代码可能会对你有所帮助。还有这个SQLFiddle。
阶段1:将水平逗号分隔的数据转换为列数据。
SELECT
Split.a.value('.', 'VARCHAR(100)') AS data
FROM (SELECT
CAST ('<M>' + REPLACE([id], ',', '</M><M>') + '</M>' AS XML) AS String
FROM T) AS A CROSS APPLY String.nodes ('/M') AS Split(a)
这里T
是您的表,id
是包含逗号分隔数据的列名。
第二阶段:现在合并这个查询和你的主表得到结果。
select * from
(SELECT
Split.a.value('.', 'VARCHAR(100)') AS data
FROM (SELECT
CAST ('<M>' + REPLACE([id], ',', '</M><M>') + '</M>' AS XML) AS String
FROM T) AS A CROSS APPLY String.nodes ('/M') AS Split(a)) as CSV
where data not in (select * from T1)
为了性能和效率,在比较两个表的输出时请使用NOT EXISTS
像这样:
SELECT * FROM Tbl1 t1 WHERE NOT EXISTS (SELECT * FROM Tbl2 t2 WHERE t2.Col1 = t1.Col1)