我程序里有个无序、无规则、不定长数组。
现有ORACLE数据库里的表A(id varchar2(10)),
我想一次查出数组里的元素哪些不在表A的id字段里,请问怎么查啊?
例如数组元素为 ["aa","123","32a","sfs21",......]
表A的记录为
aa
421
sfs21
bsda要求返回结果为:
123
32a我现在的办法是让程序根据数组自动拼成如下SQLselect B.id from A ,
(
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 = A.id(+)
and A.id is null确实能一次查出来正确的结果,但是这办法有点笨。
有无更好的方法呢?
现有ORACLE数据库里的表A(id varchar2(10)),
我想一次查出数组里的元素哪些不在表A的id字段里,请问怎么查啊?
例如数组元素为 ["aa","123","32a","sfs21",......]
表A的记录为
aa
421
sfs21
bsda要求返回结果为:
123
32a我现在的办法是让程序根据数组自动拼成如下SQLselect B.id from A ,
(
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 = A.id(+)
and A.id is null确实能一次查出来正确的结果,但是这办法有点笨。
有无更好的方法呢?
解决方案 »
- oracle yyyy-mm-dd hh24:mi:ss 转换成 yyyy-mm-dd
- 遇到一个sql问题,求助
- oracle数据库命令imp导入pde文件
- 一个SQL查询问题,麻烦大家进来帮帮忙.急急急.
- oracle 9i登录OMS后在管理工具中怎么没有数据库节点?怎样添加数据库节点?
- oracl92数据库恢复[冷备份、恢复错误]--急,在线等
- oracle performance manager数据库乱码??急!
- 请问oracle中的游标可否定位???
- oracle触发器
- 在ORACLE数据库中,怎么insert不同用户下的所有表
- php 向oracle中插不进去数据
- 每月的后五天每天凌晨3点执行一次的计划任务
where id not in ('aa','123','32a','sfs21'...);
aa
421
sfs21
bsda
bb
bb不可以检索出来的,要在('aa','123','32a','sfs21')范围内似乎没什么好办法吧
有差异哦,用他的SQL,结果会是
421
bsda不对哦
哦,了解你的意思了。你的参数是一个类似数组的字符串么用procedure来解决,临时表对于你来说是透明的,你看不到的。而且不会出现你说的有很多次和server端交互的问题。
你说是用带参数的存储过程吧?
而且我这不是字符串,就是个字符串数组哦。当然,可以按照一定的格式拼成一个长字符串,到存储过程里再解析。
嘿嘿,但是啊!XD我对procedure不熟啊
其实我主要是想问怎么写这个SQL才能把我的数组变成一个虚拟的数据库表,这样就能和表A关联,取出不存在的记录了
理论上应该可以做一个function参数是你的字符串,返回值是一个数组,然后结合内存表table()函数这样的话,你的查询就变成了select * from 表A where not exists (select 1 from table(funcationname('aa','123','32a','sfs21')) b where 表A.col=b.col)关键是这个function了。
返回的数组是指存储过程中像如下定义出来的一种集合吗?TYPE 数组类型 IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
数组名 数组类型;那么我要做的就是把我程序中的数组以特定格式变为字符串,如
["aa","123","32a","sfs21",......] 变成 "aa,123,32a,sfs21"
定义PL/SQL中function为 functionname(varchar2),传入"aa,123,32a,sfs21"后
会以逗号分隔然后将分隔后的每个短字符串作为元素加入到上面说的数组集合中,最后把数组返回。最后就是在程序中编写你的那条SQL:select * from 表A where not exists (select 1 from table(funcationname('aa','123','32a','sfs21')) b where 表A.col=b.col) 是这样理解吗?好像真的可以啊!
是否要自定义 PL/SQL TYPE 啊
是的要先type一个类型出来
我觉得基本可以结贴了,虽然我还没完全实验通过
但是我觉得inthirties给的思路可以实现!
感谢zxf_feng,感谢Robin_Ares ,感谢ojuju10 ,感谢lg3605119 !
特别感谢inthirties。
同时感谢csdn,感谢cctv,感谢MTV,感谢所有TV,
这么长时间以来对我的关心和鼓励,那啥~~~~~~~
好!
谢谢你的关注啊,非常感谢。
not in 查出的是表里有 , 数组没有的,
本来就是数组里没有的,用数组再去减,是无意义的啊。
用IN倒是对的。但那几乎是把数据库中的数据全取出来了。
这样的话在程序中比对的次数理论上会是: 数组元素个数×数据库记录数
当两个数据量差不多而且都比较大的时候,再加上我用的是JAVA,会相应产生许多对象生成、内存分配的时间
那么效率方面就有点恐怖了。。所以把比对的事情交给已经成熟的数据库处理,我认为是比较好的。
谢谢你的关注啊,非常感谢。