【发布时间】:2012-01-29 15:03:36
【问题描述】:
给定一个 ID 列表,我需要确定那些不在 Oracle 数据库中的 ID。例如,给定表格:
my_table
+----+-------+
| ID | DATA |
+----+-------+
| 1 | Foo |
+----+-------+
| 3 | Bar |
+------------+
| 5 | Etc |
+------------+
...给定列表 [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')
但这看起来很笨拙,很快就会变得一团糟,因为实际上我一次要处理数百个 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')
另一种选择是以编程方式进行。我可以在数据库中查询现有的 ID。然后在代码中,我可以删除从原始列表中找到的列表,以获取不在数据库中的子列表。这会起作用,但我认为让数据库完成这项工作会更有效吗?
谢谢
【问题讨论】:
-
您是否在其他表上进行
JOIN并比较结果?您总是可以在这张桌子上做一个OUTER JOIN,对着另一个,然后在第二张桌子上测试哪些是Null。 -
不,很遗憾,加入将不起作用。我们有来自一个系统的 ID,需要确定哪些 ID 不在另一个系统中。 (完全不同的系统和数据库。)例如,我们有来自工资系统的员工 ID,需要找出哪些 ID 不在停车登记系统中。谢谢。
-
加入会起作用。您可能只需要先进行一些设置,例如将“其他”ID 放入可以连接的自己的表中。
-
@wadesworld 谢谢。我想到了一个临时表。但我的印象是临时表是昂贵的操作。这是一个需要经常运行的查询。因此,根据我对 SQL 优化的有限知识,我认为编程解决方案会比使用临时表更有效。
-
@antisanity 他们在不同的服务器上。而且我们无权访问原始系统或数据库。 ID 是通过服务请求提交的。然后我们需要提取我们没有记录的 ID。