段落一:
select t1.uuid,t1.circuitcode,t1.belongcity,t2.label
from res_circuit t1,
dt_region t2
where t1.belongcity=t2.cityid
and exists(
select 1
from
(
select tt1.circuitcode,count(1) cnt
from res_circuit tt1
group by tt1.circuitcode
)tt2
where cnt>1
and tt2.circuitcode=t1.circuitcode
)
order by t1.circuitcode段落二:
select t1.uuid,t1.circuitcode,t1.belongcity,t2.label,t1.aendroom,t1.zendroom
from res_circuit t1,
dt_region t2
where t1.belongcity=t2.cityid
and t1.circuitcode in
(
select tt2.circuitcode
from
(
select tt1.circuitcode,count(1) cnt
from res_circuit tt1
group by tt1.circuitcode
)tt2
where cnt>1
)
order by t1.circuitcode第一段执行的很慢,几分钟还是没有结果,第二段不到一秒钟就出来了,速度相差非常大,照理说,in是没有exists快,但是这个为什么反常呢?哪位大侠解释一下。
select t1.uuid,t1.circuitcode,t1.belongcity,t2.label
from res_circuit t1,
dt_region t2
where t1.belongcity=t2.cityid
and exists(
select 1
from
(
select tt1.circuitcode,count(1) cnt
from res_circuit tt1
group by tt1.circuitcode
)tt2
where cnt>1
and tt2.circuitcode=t1.circuitcode
)
order by t1.circuitcode段落二:
select t1.uuid,t1.circuitcode,t1.belongcity,t2.label,t1.aendroom,t1.zendroom
from res_circuit t1,
dt_region t2
where t1.belongcity=t2.cityid
and t1.circuitcode in
(
select tt2.circuitcode
from
(
select tt1.circuitcode,count(1) cnt
from res_circuit tt1
group by tt1.circuitcode
)tt2
where cnt>1
)
order by t1.circuitcode第一段执行的很慢,几分钟还是没有结果,第二段不到一秒钟就出来了,速度相差非常大,照理说,in是没有exists快,但是这个为什么反常呢?哪位大侠解释一下。
解决方案 »
- rman怎么新建数据库啊?
- 8张表有共同的列的更新
- 急,知道ORA错误代码怎么查对应的sqlstate value
- 菜鸟请教存储过程调用问题
- 请教一个sql语句,很多分组每组只取一条的,谢谢!!!!
- ora-27101 数据库实例启动不了
- 下面是一段自己修改的一个oracle存储过程,里面错误应该很多,大家找。按错误个数及难度给分.
- 走过,路过,请帮小弟一把:关于数据库的备份问题再次请教??
- imp导入成功,但数据库中找不到导入的数据表及视图
- 请我columnar database是什么意思?干什么的,怎么翻译?
- 安装oracle92时出现“加载数据库出错 areas Queriec"
- (求助)一个诡异的问题
IN :子查询来驱动父查询
exist:父查询驱动子查询
所以如果子查询小的话,则可以采用in会快一些,如果子查询大的话,则采用exists会快一些。
1楼总结的非常不错。
SELECT t1.uuid, t1.circuitcode, t1.belongcity, t2.label
FROM res_circuit t1,
(SELECT tt1.circuitcode, COUNT(1) cnt
FROM res_circuit tt1
GROUP BY tt1.circuitcode) tt2 dt_region t2
WHERE t1.belongcity = t2.cityid
AND tt2.circuitcode = t1.circuitcode
AND tt2.cnt >= 2
ORDER BY t1.circuitcode;
FROM res_circuit t1,dt_region t2,
(SELECT tt1.circuitcode, COUNT(1) cnt
FROM res_circuit tt1
GROUP BY tt1.circuitcode) tt2
WHERE t1.belongcity = t2.cityid
AND tt2.circuitcode = t1.circuitcode
AND tt2.cnt >= 2
ORDER BY t1.circuitcode;
少写了个','.
若子查询结果集比较小,优先使用in,若外层查询比子查询小,优先使
用exists。因为若用in,则oracle 会优先查询子查询,然后匹配外层查询,
若使用exists,则oracle 会优先查询外层表,然后再与内层表匹配。最优化
匹配原则,拿最小记录匹配大记录。
大则 exists 否则 in