还是关于树的问题,请教各位大侠。

xfwf 2007-10-29 03:14:31
假设以下商品表结构(树形):

--食品
|--水果
|--香蕉
|--苹果
|--蔬菜
|--青菜
...

declare @TreeTable (ID smallint,PID smallint,name)
insert @TreeTable
select 1,0,'食品'
union all
select 2,1,'水果'
union all
select 3,1,'蔬菜'
union all
select 4,2,'香蕉'
union all
select 5,2,'苹果'
union all
select 6,3,'青菜'

已知可以得到一个表:
ID PID Name
5, 2,苹果

怎样能够根据上述二表得到下列的一个表:
ID PID Name
1, 0,食品
2, 1,水果
5, 2,苹果

或者

已知可以得到一个表:
ID PID Name
5, 2,苹果
6, 3,青菜
怎样能够根据上述二表得到下列的一个表:
ID PID Name
1, 0,食品
2, 1,水果
3, 1, 蔬菜
5, 2,苹果
6, 3, 青菜


相当于将一个叶子节点组成的表,赋给他相应的树的结构。请各位大侠帮我看下。谢谢。
...全文
90 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xfwf 2007-11-01
  • 打赏
  • 举报
回复
to: pt1314917:
其实就是一个简单的,比如:Select * from Treetable
只不过,我在客户端中需要在后边根据用户操作加上相应条件语句,比如 where id=5 等,
那样的话,可能就比较麻烦。
pt1314917 2007-10-30
  • 打赏
  • 举报
回复
要不楼主把得到那个结果集的存储过程或者视图贴出来。 一起优化下?
samfeng_2003 2007-10-29
  • 打赏
  • 举报
回复
其实这个问题应该很灵活的,比如可以在函数中改
INSERT INTO @t
SELECT *,@i FROM Test A WHERE EXISTS ( SELECT * FROM TreeTable B WHERE A.ID = B.ID AND A.PID = B.PID)
这里的查询语句
也可以把查询的结果集全部合成一个字符串,用特殊符号连接,然后进函数以后撤分成表进行处理.应该方法是很多的!
xfwf 2007-10-29
  • 打赏
  • 举报
回复
To :samfeng_2003
谢谢你,你的程序的确可以达到目的,不过,我还想请教你,因为那个Test表其实是我查询的一个结果集,也就是说他不是一个数据库中的表,而是一个结果集,所以他不能放在函数中,这样的话,又该如何处理呢?
samfeng_2003 2007-10-29
  • 打赏
  • 举报
回复
不好意思,多复制了一遍,请自行清理和测试!
samfeng_2003 2007-10-29
  • 打赏
  • 举报
回复
CREATE TABLE TreeTable ( ID smallint, PID smallint, name VARCHAR(20))
insert TreeTable
select 1,0, '食品 '
union all
select 2,1, '水果 '
union all
select 3,1, '蔬菜 '
union all
select 4,2, '香蕉 '
union all
select 5,2, '苹果 '
union all
select 6,3, '青菜 '

GO

CREATE TABLE Test( ID smallint, PID smallint, name VARCHAR(20))
insert Test
select 5,2, '苹果 '
union all
select 6,3, '青菜 '


SELECT * FROM Test
SELECT * FROM TreeTable
GO
CREATE FUNCTION F_Tree()
RETURNS @t TABLE( T_ID INT IDENTITY(1,1),ID smallint, PID smallint, name VARCHAR(20), LEVEL INT)
AS
BEGIN
DECLARE @i INT
SET @i = 0
INSERT INTO @t
SELECT *,@i FROM Test A WHERE EXISTS ( SELECT * FROM TreeTable B WHERE A.ID = B.ID AND A.PID = B.PID)

WHILE EXISTS ( SELECT * FROM @t A, TreeTable B WHERE A.PID = B.ID AND A.Level = @i )
BEGIN
INSERT INTO @t
SELECT B.*,@i+1 FROM @t A, TreeTable B WHERE A.PID = B.ID AND A.Level = @i
SET @i = @i + 1
END
RETURN
END
GO

SELECT ID,PID,NAME FROM dbo.F_Tree() GROUP BY ID,PID,NAME

DROP FUNCTION F_Tree
DROP TABLE Test
DROP TABLE TreeTable

CREATE TABLE TreeTable ( ID smallint, PID smallint, name VARCHAR(20))
insert TreeTable
select 1,0, '食品 '
union all
select 2,1, '水果 '
union all
select 3,1, '蔬菜 '
union all
select 4,2, '香蕉 '
union all
select 5,2, '苹果 '
union all
select 6,3, '青菜 '

GO

CREATE TABLE Test( ID smallint, PID smallint, name VARCHAR(20))
insert Test
select 5,2, '苹果 '
union all
select 6,3, '青菜 '


SELECT * FROM Test
SELECT * FROM TreeTable
GO
CREATE FUNCTION F_Tree()
RETURNS @t TABLE( T_ID INT IDENTITY(1,1),ID smallint, PID smallint, name VARCHAR(20), LEVEL INT)
AS
BEGIN
DECLARE @i INT
SET @i = 0
INSERT INTO @t
SELECT *,@i FROM Test A WHERE EXISTS ( SELECT * FROM TreeTable B WHERE A.ID = B.ID AND A.PID = B.PID)

WHILE EXISTS ( SELECT * FROM @t A, TreeTable B WHERE A.PID = B.ID AND A.Level = @i )
BEGIN
INSERT INTO @t
SELECT B.*,@i+1 FROM @t A, TreeTable B WHERE A.PID = B.ID AND A.Level = @i
SET @i = @i + 1
END
RETURN
END
GO

SELECT ID,PID,NAME FROM dbo.F_Tree() GROUP BY ID,PID,NAME

DROP FUNCTION F_Tree
DROP TABLE Test
DROP TABLE TreeTable
xfwf 2007-10-29
  • 打赏
  • 举报
回复
补充以下:
如果这里我有一个SqL自定义函数:
function f_pid(@ID smallint) -- 引用自邹建的技术文章
给定一个ID,可以查询出所有的父节点.比如:
select * from f_pid( 6)
得到结果:
ID Level
3 0 //蔬菜层
1 1 //食品层
如果利用这个函数,会不会容易点.
love985 2007-10-29
  • 打赏
  • 举报
回复
不好意思,看错了.:-(
love985 2007-10-29
  • 打赏
  • 举报
回复
表建得不好!
应该多一列,数结构才明显
declare @TreeTable (ID smallint,ParenId smallint,PID smallint,name)
insert @TreeTable
select 1,0,0, '食品 '
union all
select 2,1,1, '水果 '
union all
select 3,1,1, '蔬菜 '
union all
select 4,2,2, '香蕉 '
union all
select 5,2,2, '苹果 '
union all
select 6,3,3, '青菜 '
dobear_0922 2007-10-29
  • 打赏
  • 举报
回复
这个比较麻烦,帮顶

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧