今天突然看到之前自己写的一个代码 久久没想通为毛。。 看来笔记还是需要
exists可以代替子查询in 比in 更高效
默认是exists 查询中包含有数据则条件成立。。否则没数据
select * from table where exists(select count(*) from table2 tb2 where tb2.id==1) exists查询出数据则 条件成立 显示所有table中的数据
当处理需要查询父表的某列 需要满足子表的列结果时就可以用exists来代替in
in写法
select * from table1 t
where t.id in(select tb2id from table2);
exists写法
select * from table1 t
where exists(select * from table2 t2 where t2.id=t1.id);
个人理解 执行方式是 先查出table1的数据 然后通过table1的数据一条一条匹配table2的数据条件成立(table1的id在table2中存在 则这条数据成立)则输出
应用场景1 查询部门以及部门以下数据时候 部门表的每条数据 需要在path记录他上层父类的id 这个就是我当前需求用到的。
别人的效率测试
在oracle 10g中,in 和 exists其实是一样的,原理就是两张表做HASH JOIN SEMI。也可以通过10053事件看到两条sql语句最终转换成同一条sql。
not in 性能 大于not exists test1的数据量5条,test2数量40多万条。
not exists 性能 大于not in test1的数据量1000条,test2数量50687条。