Oracle中的exists和in

写在前

今天有一个业务,前台是一个供用户选择条件进行查询的功能。选择完毕后点击查询,前台使用get方式发送打包好的参数列表到后台(Controller),持久层拿到参数列表后拼装到SQL中,使用jdbc连接oracle拿数据。


问题

当条件过大(据说有7000多个数据),出现第一个问题,413 FULL HEAD ERROR。很明显是数据量过大,而使用的又是get方式传输,get请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连。如:login.action?name=cym&password=idontknow。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。GET方式提交的数据依据浏览器而定,IE环境下的URL长度限制为2083,理论上POST没有限制,可传较大量的数据。

第二个问题出现在SQL,拼接字符串中使用的where...in..,JDBC会抛出“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”这个异常。没想到oracle还有这种限制,据说11g后不存在这个限制。


解决方案

一 使用临时表       SELECT * FROM t WHERE id IN (SELECT id FROM temp)

建立一个表来存储传入参数,取数据的时候先从临时表中遍历取参数,然后再将取出的参数拿去作为in条件


二使用exists   SELECT * FROM a WHERE EXISTS( SELECT 1 FROM b WHERE a.employee_id=b.employee_id)


对比

IN比 EXISTS 的可读性更好

EXISTS 比IN 的表达性更好(更适合复杂的语句)

二者之间性能没有差异(但对于某些数据库来说性能差异会非常大)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值