一个SQL的问题

[复制链接]
查看11 | 回复9 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
有 a ,b两张表
a中kind 表是机构级别
01为一级机构
02为二级机构
03为三级机构
b表为关系表
表示机构的所属关系,如果没有下属分公司 则留空

a 表
字段名称 kind
name
记录一01
总公司
记录二02
北京分公司
记录三03
西城支公司
记录四02
深圳分公司
记录五03
东城区公司
记录六02
宁波区公司
b表
字段名称 idleftcode(上级公司)rightcode (下级公司)
记录一 1
总公司
北京分公司
记录二 2 总公司
深圳分公司
记录三 3 总公司
宁波分公司
记录四 4 北京分公司 东城区公司
记录i五 5北京分公司 西城区公司
-===========================================
现在想要通过一个SQL完成机构的层级所属关系
如:
01 02
03
总公司北京分公司 西城区公司
总公司北京分公司 东城区公司
总公司宁波分公司
总公司深圳分公司
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
建表脚本和测试数据
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
已更新请看主题 谢谢
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
如果仅仅是3级的,自连接应该可以了。
[php]
SQL> With b As (
2Select 1 Id,'总公司' leftcode,'北京分公司' rightcode From dual Union All
3Select 2 Id,'总公司' leftcode,'深圳分公司' rightcode From dual Union All
4Select 3 Id,'总公司' leftcode,'宁波分公司' rightcode From dual Union All
5Select 4 Id,'北京分公司' leftcode,'东城区公司' rightcode From dual Union All
6Select 5 Id,'北京分公司' leftcode,'西城区公司' rightcode From dual )
7select b1.leftcode "01",b1.rightcode "02",b2.rightcode "03" from
8(select leftcode,rightcode from b where leftcode='总公司' ) b1,
9(select leftcode,rightcode from b where leftcode!='总公司' ) b2
10where b1.rightcode=b2.leftcode(+)
11/
01 02 03
---------- ---------- ----------
总公司 北京分公司 东城区公司
总公司 北京分公司 西城区公司
总公司 宁波分公司
总公司 深圳分公司
SQL>
[/php]
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
先用sys_connect_by_path函数对表B分析,得出树型结构然后再分解
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
Select path From (SelectRight,'>>总公司'||sys_connect_by_path(rtrim(Right),'>>') path
From tmp_b
Start With Left = '总公司
'
Connect By Prior rtrim(Right) =rtrim(Left)) a
Where Not Exists (Select * From tmp_b b Where a.Right = b.Left)
;
-----------------------------
>>总公司>>北京分公司>>东城区公司
>>总公司>>北京分公司>>西城区公司
>>总公司>>宁波分公司
>>总公司>>深圳分公司

接下来如何将上面一列分解成多列我也不会,请高手解决,学习中。
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
谢谢楼上
可是我这个未必就是三级的
如果级别不确定该如何去处理?
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
顶一下先
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
谢谢楼上的顶
高手出来下 先....
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
弄些测试脚本,和你想要的结果,如果4级怎么显示?
你可以考虑jvkojvko的方法,在用函数进行处理!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行