在表a中查找id在list中的记录,并列出list中没有找到对应记录的元素,list和表a都是10万级别的,求赐教

时间:2022-04-16 15:14:08
需求是这样,
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


引用
 select * from List l where not exists(select 1 from a where l.id=a.id)

抱歉,是我没有说清楚,

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)

#5


引用
2. 返回没有找到记录的id。select * from a where id not exists(select 1 FROM :idList where a.id=idlist)

回复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为'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)


多谢 在表a中查找id在list中的记录,并列出list中没有找到对应记录的元素,list和表a都是10万级别的,求赐教,这样可以实现直接在数据库中完成的,
但是,不知道如果idList太长的话,会不会有什么影响,  idList的长度是十几万条的时候会有不会有问题, 在表a中查找id在list中的记录,并列出list中没有找到对应记录的元素,list和表a都是10万级别的,求赐教

#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


引用
 select * from List l where not exists(select 1 from a where l.id=a.id)

抱歉,是我没有说清楚,

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)

#5


引用
2. 返回没有找到记录的id。select * from a where id not exists(select 1 FROM :idList where a.id=idlist)

回复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为'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)


多谢 在表a中查找id在list中的记录,并列出list中没有找到对应记录的元素,list和表a都是10万级别的,求赐教,这样可以实现直接在数据库中完成的,
但是,不知道如果idList太长的话,会不会有什么影响,  idList的长度是十几万条的时候会有不会有问题, 在表a中查找id在list中的记录,并列出list中没有找到对应记录的元素,list和表a都是10万级别的,求赐教

#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