表结构:部门deptid,父级部门parentdeptid,。。。。数据库的每一条记录都记录了自身ID和父级部门ID,现在要从某个部门查询其下属部门生成一棵部门关系树,sql如下:
select so.orgid,so.parentdeptid,so.orgname from sys_orginfo so start with so.orgid=xxx connect by prior so.orgid=so.parentdeptid;
xxx表示查询的部门ID。
如果知道某部门的ID,想查询出其父级部门以及父级的父级,也就是进行回溯找到根,sql如下:
select so.orgid,so.parentdeptid,so.orgname from sys_orginfo so start with so.orgid=xxx connect by prior so.parentdeptid=so.orgid;
XXX表示从那个部门开始进行回溯
两条SQL的区别就是connect by的条件交换一下。
回溯结果查出来的是父级关系的多行数据(ORACLE列转行,列合并),现在想把部门连接到一行显示,比如C的父级是B,B的父级是A,现在想拼成A/B/C sql如下:
select replace(wmsys.wm_concat(orgname),',','/') from (select so.orgid,so.parentdeptid,so.orgname from sys_orginfo so start with so.orgid=xxx connect by prior so.parentdeptid=so.orgid) ;
ORACLE的wmsys包下面的wm_concat()函数能把指定的列数据用逗号连接成一行。