oracle查不在表里的记录

我程序里有个无序、无规则、不定长数组。
现有ORACLE数据库里的表A(id varchar2(10)),
我想一次查出数组里的元素哪些不在表A的id字段里,请问怎么查啊?
例如数组元素为 ["aa","123","32a","sfs21",......]
表A的记录为
aa
421
sfs21
bsda

要求返回结果为:
123
32a

我现在的办法是让程序根据数组自动拼成如下SQL

select B.ID from A ,
(
select 'aa' as seq from dual
UNION
select '123' as seq from dual
UNION
select '32a' as seq from dual
UNION
select 'sfs21' as seq from dual
UNION
... ....
) as B
where B.seq = A.seq(+)
and A.seq is null

确实能一次查出来正确的结果,但是这办法有点笨。
有无更好的方法呢?
回复badkano :不是数据库里的数据,别处来的
回复ppq1008 :因为数组元素、数据库数据都差不多是8000左右的,需求就是每次查出没有的数据。如果按我的办法会拼出一条8000行的SQL,所以觉得笨啊。如果是逐条查询是否存在、或者建立临时表插入数据,是否也会与数据库交互8000次?有点恐怖。。。。

说是数组,其实吧是个JAVA的List集合,我只是打个比方。
最新回答
别说你也难过

2024-05-18 04:36:04

["aa","123","32a","sfs21",......]
你这堆东西怎么来的?产生于文本文件还是数据库其他表?

-----补充------
可以把你的那堆数据用substr函数和instr函数给分隔开
但是因为长度不确定,所以好像单独靠sql控制比较困难
给你举个例子
譬如有个字符串内容包含[v1,v2,v3]

select substr('v1,v2,v3',1,instr('v1,v2,v3',',',1,1)-1) from dual;

select substr('v1,v2,v3',instr('v1,v2,v3',',',1,1)+1,(instr('v1,v2,v3',',',instr('v1,v2,v3',',',1,1)-1,2)-(instr('v1,v2,v3',',',1,1)+1))) from dual;

这个能取出v1和v2,v3实在太麻烦了,不过你可以参考一下
山水闲人

2024-05-18 04:39:48

你那方法并不笨,但是你的SQL语句有问题
那种写法会将B数据的所有记录读出来再与A表组合产生一个新的集合
我看你的A表数据较少,直接用
select id from
(
select 'aa' as id from dual
UNION
select '123' as id from dual
UNION
select '32a' as id from dual
UNION
select 'sfs21' as id from dual
UNION
... ....
) B
where B.id not in (select A.id from A)

如果A表数据量也大,not in会有性能问题,我建议你将数组导入临时表B,再从B表删掉A中有的数据。

另一方面,既然你能将数组拼成SQL,我估计你的数组的数据量并不大,所以才认为你的方法是可以的。通过脚本拼SQL已经相当好的办法了。
不知道你因为什么原因认为这个方法笨。