在数据库数据中找不到时从预定义数据返回的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的别名),而且很可能是非常低效的。

谢谢你的建议!

在数据库数据中找不到时从预定义数据返回的SQL查询

喝了杯咖啡,休息了一会儿,我想我有了最好的解决办法。

考虑到这将是一个存储过程,存储过程将执行以下操作:

  1. 创建TempTable,如果不存在,则截断
  2. INSERT (CSVList) INTO TempTable
  3. SELECT Alias FROM TempTable WHERE Alias NOT IN (SELECT Alias FROM MainTable)

这样我就可以将列表指定为一个表,并且只从中选择一次:)

假设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)