idList中存放了要查询的id,假设为:1,2,3,
数据表a中有id为1,3,4,5的记录,没有id为2的,
现在需要
1. 查找idList中的所有记录;
2. 返回没有找到记录的id。
3. 如果idList和a表都很大的时候(十万级别),怎么处理?
数据库是oracle,
后台是通过jdbcTemplate来操作的数据库,
我现在能想到的解决办法是:
1. 通过select * from a where id in(:idList)找出idList中需要的记录,存到recordList
2. 再通过对比recordList和idList找到没有查找到记录的id。
但是这样的话当数据量到十万级别的时候效率就很低了,想问下有没有什么更好的办法??请各位大神不吝赐教~~
8 个解决方案
#1
select * from List l where not exists(select 1 from a where l.id=a.id)
#2
select * from List l where not exists(select 1 from a where l.id=a.id)
#3
抱歉,是我没有说清楚,
idList是一个java List变量不是一个表格,
a才是一个数据表
#4
1. 查找idList中的所有记录;select * from a where id in(:idList)
2. 返回没有找到记录的id。select * from a where id not exists(select 1 FROM :idList where a.id=idlist)
2. 返回没有找到记录的id。select * from a where id not exists(select 1 FROM :idList where a.id=idlist)
#5
回复4楼:
我的意思是找出java 对象idList中的没有在表a中找到的id,
不是表a中存在但idList中不存在的
#6
2. 返回没有找到记录的id :
--注::idlist为'1,2,3,4,5,6,7'
SELECT t.id
FROM
(
SELECT REGEXP_SUBSTR('1,2,3,4,5,6,7','[^,]+',1,LEVEL) id
FROM DUAL
CONNECT BY LEVEL<=
LENGTH('1,2,3,4,5,6,7')-LENGTH(REPLACE('1,2,3,4,5,6,7',','))+1
) t
WHERE ID NOT EXISTS(
SELECT 1 FROM a WHERE a.id=t.id)
#7
多谢 ,这样可以实现直接在数据库中完成的,
但是,不知道如果idList太长的话,会不会有什么影响, idList的长度是十几万条的时候会有不会有问题,
#8
--注::idlist为'1,2,3,4,5,6,7'
SELECT t.id
FROM
(
SELECT REGEXP_SUBSTR('1,2,3,4,5,6,7','[^,]+',1,LEVEL) id
FROM DUAL
CONNECT BY LEVEL<=
LENGTH('1,2,3,4,5,6,7')-LENGTH(REPLACE('1,2,3,4,5,6,7',','))+1
) t
WHERE NOT EXISTS(
SELECT 1 FROM a WHERE a.id=t.id)
这样才是正确的, not exists前面不应该有id
#1
select * from List l where not exists(select 1 from a where l.id=a.id)
#2
select * from List l where not exists(select 1 from a where l.id=a.id)
#3
抱歉,是我没有说清楚,
idList是一个java List变量不是一个表格,
a才是一个数据表
#4
1. 查找idList中的所有记录;select * from a where id in(:idList)
2. 返回没有找到记录的id。select * from a where id not exists(select 1 FROM :idList where a.id=idlist)
2. 返回没有找到记录的id。select * from a where id not exists(select 1 FROM :idList where a.id=idlist)
#5
回复4楼:
我的意思是找出java 对象idList中的没有在表a中找到的id,
不是表a中存在但idList中不存在的
#6
2. 返回没有找到记录的id :
--注::idlist为'1,2,3,4,5,6,7'
SELECT t.id
FROM
(
SELECT REGEXP_SUBSTR('1,2,3,4,5,6,7','[^,]+',1,LEVEL) id
FROM DUAL
CONNECT BY LEVEL<=
LENGTH('1,2,3,4,5,6,7')-LENGTH(REPLACE('1,2,3,4,5,6,7',','))+1
) t
WHERE ID NOT EXISTS(
SELECT 1 FROM a WHERE a.id=t.id)
#7
多谢 ,这样可以实现直接在数据库中完成的,
但是,不知道如果idList太长的话,会不会有什么影响, idList的长度是十几万条的时候会有不会有问题,
#8
--注::idlist为'1,2,3,4,5,6,7'
SELECT t.id
FROM
(
SELECT REGEXP_SUBSTR('1,2,3,4,5,6,7','[^,]+',1,LEVEL) id
FROM DUAL
CONNECT BY LEVEL<=
LENGTH('1,2,3,4,5,6,7')-LENGTH(REPLACE('1,2,3,4,5,6,7',','))+1
) t
WHERE NOT EXISTS(
SELECT 1 FROM a WHERE a.id=t.id)
这样才是正确的, not exists前面不应该有id