如何在不与sql中的其他表进行对比的情况下显示不在表中的数据

时间:2019-03-04 13:36:22

标签: mysql sql oracle-sqldeveloper backend plsqldeveloper

我有一个名为FILEINFO的表。每天会有一些文件名(大约100个)出现。我需要检查表中是否存在名称。在一个查询中

预先感谢

2 个答案:

答案 0 :(得分:2)

我不知道这是否适合您的数据管道,但是这里一种干净的方法是将这些新传入的文件名写入某种表(临时表或永久表)中,然后使用简单的存在查询来检查它们是否已经存在于当前表中,例如

SELECT filename AS new_file
FROM temp_names t1
WHERE NOT EXISTS (SELECT 1 FROM FILEINFO t2 WHERE t2.filename = t1.filename);

如果您只想插入新文件名,则可以使用类似的逻辑,例如

INSERT INTO FILEINFO (filename)
SELECT filename
FROM temp_names t1
WHERE NOT EXISTS (SELECT 1 FROM FILEINFO t2 WHERE t2.filename = t1.filename);

答案 1 :(得分:1)

另一种方法是不使用临时表(Tim Biegeleisen回答)。
这种方法只会使用一个查询

SELECT 
  FILEINFO.filename
FROM (
  SELECT 'filename1' AS filename FROM DUAL
  UNION
  SELECT 'filename2' AS filename FROM DUAL
) AS file_names 
LEFT JOIN 
 FILEINFO 
ON
 file_names.filename = FILEINFO.filename
WHERE 
 FILEINFO.filename IS NULL

此查询也应在MySQL和Oracle数据库中均有效。
两个数据库系统都将DUAL用作“虚拟”表以允许无表SELECT