一个Oracle递归查询,它是如此之慢,为什么?

时间:2015-06-29 09:14:56

标签: sql oracle

我想查询指定级别的数据表。

例如,我想询问父子之间关系的深度1,那就是我的方式。

1。我首先递归查询所有数据的级别。

SELECT c.cid,pcid,level lv 
  FROM qm_product_cat c 
  start with pcid='0' CONNECT BY PRIOR CID=pcid

2。然后我查询,

 select * from (
 SELECT c.cid,pcid,level lv 
  FROM qm_product_cat c 
  start with pcid='0' CONNECT BY PRIOR CID=pcid
  ) where lv = 1

问题:这是如此缓慢和重复。为什么?你有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果您只对第一级的行感兴趣,那么您根本不需要分层查询,也不需要内部联接查询, 只需添加where pcid='0'子句:

select cid, pcid from qm_product_cat where pcid = '0';

...但是如果你坚持使用层次结构,或者你想要从最高级别到3级的行,你可以在connect by clause中添加级别条件:

select cid,pcid,level lv 
  from qm_product_cat c 
  start with pcid='0' 
  connect by prior cid=pcid AND LEVEL<=1;

这种方式查询在指定级别停止,不会进一步下降。

SQLFiddle demo