首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

有关自连接的查询有关问题(。)

2012-03-28 
有关自连接的查询问题(在线等。。。)如题,表如下:id(int)name(nvarchar)parent_id(int)1pp1_102pp2_103pp3_21

有关自连接的查询问题(在线等。。。)
如题,表如下:
id(int)         name(nvarchar)           parent_id(int)
      1                           pp1_1                             0
      2                           pp2_1                             0
      3                           pp3_2                             1
      4                           pp4_2                             2
      5                           pp5_3                             3
      6                           pp6_4                             5

现在需要一个存储过程,接收id为参数(比如输入6),结果集中要包含id为
6这条记录和他的parent_id,parent_id要一直到1(根)
例如:输入6
结果中包含 6 5 3 1
不知道我说清楚没有,请高手帮忙~在线等

[解决办法]
Create proc getY(@id int)
as
declare @a table(id int, name nvarchar(30), parent_id int)
insert @a select 1 , 'pp1_1 ', 0
union all select 2 , 'pp2_1 ', 0
union all select 3 , 'pp3_2 ', 1
union all select 4 , 'pp4_2 ', 2
union all select 5 , 'pp5_3 ', 3
union all select 6 , 'pp6_4 ', 5

if object_id( 'tab ') is not null
drop table tab
declare @s varchar(1000)
declare @v varchar(1000)
declare @I int
declare @L int

set @l=0
set @I=@id
set @s= 'Create table tab( '
set @v= 'Insert into tab select '
while exists(select 1 from @a where id=@id)
begin

select @s=@s+ 'a '+ltrim(@l)+ ' int, '
select @v=@v+ltrim(@id)+ ', '
select @id=parent_id from @a where id=@id
set @l=@l+1
end
if @l=0
begin
select '无 ' as '无 '
return
end
select @s=left(@s,len(@s)-1)+ ') '
exec(@s)
select @v=left(@v,len(@v)-1)
exec(@v)
select * from tab

=====================
getY 6
[解决办法]
CREATE PROCEDURE [getid]
@id int
AS
while @id <> 0
begin
select id from table1 id = @id
select @id = parent_id from id = @id
end
GO

热点排行