导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

那位大哥会写这个的SQL语句啊!!!

huiqi2001 2003-01-16 04:06:13
数据库表结构如下:
BANKID INT 银行ID(从1开始) PK
BANKNAME 银行名称
BANKADDRESS 银行地址
PARENTBANKID INT 上级银行的银行ID(没有上级银行就为O)
BANKCODE 银行代码
BANKSTATE 银行状态(1为有效,0为无效)


对全部银行进行检索,要求以如下结构排序:

无上级银行A
A银行下属银行A1
A1银行下属银行A1-1
A1银行下属银行A1-2
A1银行下属银行A1-3
A1银行下属银行A1-4
无上级银行B
B银行下属银行B1
B1银行下属银行B1-1
B1银行下属银行B1-2
B1-2银行下属银行B1-2-1
B1-2银行下属银行B1-2-2
B1-2银行下属银行B1-2-3
B1-2-3银行下属银行B1-2-3-1
B1-2银行下属银行B1-2-4
B1银行下属银行B1-3
B银行下属银行B2
B银行下属银行B3

银行下属银行数量不确定,无限银行等级。

那位大哥会写这个的SQL语句啊,总是不能按这个结构排序:)

多谢了
...全文
8 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
playyuer 2003-01-16
树形结构的存储最简单的表结构:
ID,ParentID,....
但是要在网页上输出,仅采取上面的的结构效率会很低
,与数据库要多次查询,须要递归!
为了高效率的输出,应该考虑修改表结构:
ID,RootID,OrderID,ParentID,MaxID,Indent,Remark

RootID 存该节点的根节点
OrderID 存该节点的顺序
ParentID 存该节点的父节点
Indent 存该节点的缩进级别


--可编如下SP 在 增加子节点时维护这些信息:

ALTER PROCEDURE My_AddChild
@xx integer
AS
update tree
set orderid = isnull(orderid,0) + 1
where rootid = (select rootid
from tree
where id = @xx)
and orderid > (select orderid
from tree
where id = @xx)
insert into tree (rootid,orderid,parentid,indent,remark)
select rootid,isnull(orderid,0) + 1,@xx ,isnull(indent,0) + 1, 'Re: ' + remark
from tree
where id = @xx
update tree
set maxid = (select max(id)
from tree)
where rootid = (select rootid
from tree
where id = @xx)

select id,parentid,space(indent) + isnull(remark,id),orderid
from tree
order by maxid desc,orderid

这种结构在树形结构论坛中普遍采用!
增加子节点相对麻烦!
输出便简单了:
select id,parentid,space(indent) + isnull(remark,id),orderid
from tree
order by maxid desc,orderid


回复
playyuer 2003-01-16
树形结构的存储最简单的表结构:
ID,ParentID,....
但是要在网页上输出,仅采取上面的的结构效率会很低
,与数据库要多次查询,须要递归!
为了高效率的输出,应该考虑修改表结构:
ID,RootID,OrderID,ParentID,MaxID,Indent,Remark

RootID 存该节点的根节点
OrderID 存该节点的顺序
ParentID 存该节点的父节点
Indent 存该节点的父节点的缩进级别


--可编如下SP 在 增加子节点时维护这些信息:

ALTER PROCEDURE My_AddChild
@xx integer
AS
update tree
set orderid = isnull(orderid,0) + 1
where rootid = (select rootid
from tree
where id = @xx)
and orderid > (select orderid
from tree
where id = @xx)
insert into tree (rootid,orderid,parentid,indent,remark)
select rootid,isnull(orderid,0) + 1,@xx ,isnull(indent,0) + 1, 'Re: ' + remark
from tree
where id = @xx
update tree
set maxid = (select max(id)
from tree)
where rootid = (select rootid
from tree
where id = @xx)

select id,parentid,space(indent) + isnull(remark,id),orderid
from tree
order by maxid desc,orderid

这种结构在树形结构论坛中普遍采用!
增加子节点相对麻烦!
输出便简单了:
select id,parentid,space(indent) + isnull(remark,id),orderid
from tree
order by maxid desc,orderid


回复
mnjrh 2003-01-16
做了半天是oracle,真的晦气
回复
蓝天 2003-01-16
huiqi2001(晦气) ,oracle和MSSQL是不同的,MSSQL中就没有connect by prior 这些关键字. 所以如果不是MSSQL的问题应该先申明,否则可能你得不到你想要的答案。

回复
huiqi2001 2003-01-16
谢谢大家
回复
huiqi2001 2003-01-16
正确的SQL


select bankid, parentbankid, BANKNAME from bssbankcode
start with parentbankid=0 connect by prior bankid=parentbankid
回复
flin2002 2003-01-16
我以前是用了两个临时表,来代替数据结构中的栈,完成了这个功能。
现在想起来,确实是个下策。
回复
CrazyFor 2003-01-16
http://expert.csdn.net/Expert/TopicView1.asp?id=1343007


---按照树顺序排序
select * from treeclass order by dbo.fn_gettopclass(tc_id,'',1)

1 0 中国
4 1 北京
5 1 上海
6 1 江苏
10 6 无锡
7 6 苏州
8 7 常熟
9 6 南京
2 0 美国
11 2 纽约
12 2 旧金山
3 0 加拿大

参考一下,稍改一下那函数就可以了。
回复
huiqi2001 2003-01-16
不会吧,ORACLE版的人说要用connect by实现。
回复
路人陈 2003-01-16
你是要在用户界面上实现这个树型结构吧?结合具体的编程语言,用递归实现
回复
yelook 2003-01-16
这是一个典型的数结构问题
你这样的表构是无法用一个SQL语句来写的
怎么说呢,一句话就是表结构设计不合理吧
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告