MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

树的查询

Posted on 2007-10-31 21:13 leekiang 阅读(1821) 评论(0)  编辑  收藏 所属分类: oracle
1,查所有的子节点 select  *  from wz_tree   start with id = 1 connect by prior id = pid;
2,查所有的父节点  select  *  from wz_tree   start with id = 256 connect by prior pid = id;
   无论正树还是倒树, 关键就在于connect by的条件.
   正树:  必须是  ‘父’= prior ‘子’
   倒树:  必须是  ‘子’= prior ‘父’
3,查分类的路径, 用逗号连接:select  sys_connect_by_path(mc, ',')   from wz_tree   start with id = 1 connect by prior id = pid;http://www.itpub.net/838127.html讲的很详细。
   后注:查某个节点的全路径,用上面的办法是先取得所有节点的全路径的一个临时结果集,再从这个临时结果集里查询某个节点的全路径,这种办法太慢了。正确的做法是先查倒树的全路径,再取全路径最大的那条记录,这样做速度飞快。sql如下:
   select  max(sys_connect_by_path(mc, ','))   from wz_tree   start with id = ? connect by prior pid = id

   后注:后来发现一棵15000条记录的树,查所有节点的全路径还是非常快的(0.1秒)。
  
4,查某个表的字段名:
select max(substr(SYS_CONNECT_BY_PATH(COLUMN_NAME, ','), 2)) col
  from (select COLUMN_NAME, column_id
          from user_tab_columns
         where table_name = '&TEST')--&为plsqldeveloper里的字符串占位符,执行时会弹出对话框让你填值
 start with column_id = 1
connect by column_id = rownum;

5,select  *  from wz_tree where mc like '%五金'  start with id = 1 connect by prior id = pid;
和select  *  from wz_tree start with id = 1 connect by prior id = pid and mc like '%五金' 
二者的查询结果不一样.前者正常的先按名称进行过滤,后者过滤的是树的分支? 详见前面的链接。

6,ORA-30004: 使用 SYS_CONNECT_BY_PATH 函数时,不能将分隔符作为列值的一部分。
  这是因为分隔符在列值里出现了。这个在使用oracle的SYS_CONNECT_BY_PATH函数时是禁止的。所以要把分隔符换掉。
  如果出现过以上报错,换掉分隔符后再次执行含SYS_CONNECT_BY_PATH 函数的sql时可能会报 "ora-00600: 内部错误代码 ,参数:[kokvxsql1],[][],[],..." 。不明白为什么,但重启oracle就不报错了。

7,在oracle10g可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子,如果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支就显示“0”

8,sys_connect_by_path除了用于层次关系,还可以用于行列转换(借助rownum)。
  如把一个表的所有列连成一行,用逗号分隔:
select max(substr(sys_connect_by_path(column_name,','),2))
from (select column_name,rownum rn from user_tab_columns where table_name ='DEPT')
start with rn=1 connect by rn=rownum ;

-------------查得结果为:
DEPTNO,DEPTNAME,MGRNO

参考:
http://ons.javaeye.com/blog/227113




只有注册用户登录后才能发表评论。


网站导航: