用于获取ID的SQL查询不在表中

Lan*_*ler 5 sql oracle

给定一个ID列表,我需要确定那些不在Oracle数据库中的ID.例如,给定表:

MY_TABLE

+----+-------+
| ID | DATA  |
+----+-------+
|  1 | Foo   |
+----+-------+
|  3 | Bar   |
+------------+
|  5 | Etc   |
+------------+
Run Code Online (Sandbox Code Playgroud)

...并且给出了列表[1,2,3,4],我需要列表[2,4].

我使用一个MINUS子句提出了这个语法:

SELECT '1' as id FROM dual
UNION
SELECT '2' as id FROM dual
UNION
SELECT '3' as id FROM dual
UNION
SELECT '4' as id FROM dual
MINUS
SELECT id FROM my_table WHERE id IN ('1','2','3','4')
Run Code Online (Sandbox Code Playgroud)

但是这看起来非常笨拙并且会很快变得混乱,因为实际上我将同时处理数百个ID.获取值列表比UNION语法有更好的语法吗?

有效的东西:

/* Pseudo code */
SELECT id FROM VALUES ('1', '2', '3', '4')
MINUS
SELECT id FROM my_table WHERE id IN ('1','2','3','4')
Run Code Online (Sandbox Code Playgroud)

另一种选择是以编程方式进行.我可以在数据库中查询现有ID.然后在代码中我可以删除原始列表中找到的列表,以获取那些不在数据库中的列表.这可行,但我不正确让数据库做这项工作会更有效吗?

谢谢

Flo*_*ita 4

如此处所述:How to how-to-how-convert-csv-to-table-in-oracle 您可以将值列表转换为表。

在此之后,事情就简单了:

select * from table(splitter('a,b,c,d'))
minus
select id from my_table;
Run Code Online (Sandbox Code Playgroud)

或者

select 
  column_value as id 
from table(splitter('a,b,c,d')) a
  left join my_table b on (a.column_value = b.id)
where b.id is null;
Run Code Online (Sandbox Code Playgroud)