SQL递归获取所有父节点的函数
表结构和模拟数据如下:1河北省NULL2石家庄13保定14山西省NULL5太原46新华区27北焦村68大郭村69河南省NULL10大郭村南811大郭村北812北焦村东71...
表结构和模拟数据如下:
1 河北省 NULL
2 石家庄 1
3 保定 1
4 山西省 NULL
5 太原 4
6 新华区 2
7 北焦村 6
8 大郭村 6
9 河南省 NULL
10 大郭村南 8
11 大郭村北 8
12 北焦村东 7
13 北焦村西 7
14 桥东区 3
15 桥西区 3
我需要一个标量值函数,输入ID,递归至顶,输出“包括自己在内的所有父节点ID”
oracle搞多了,sql忘了个干净,请各位帮忙了
例如输入桥西区的ID(15),得到的结果是“15,3,1”(逗号分隔)
再提醒一下:我需要的是一个“标量值函数”,而不是“表值函数”,有劳各位了! 展开
1 河北省 NULL
2 石家庄 1
3 保定 1
4 山西省 NULL
5 太原 4
6 新华区 2
7 北焦村 6
8 大郭村 6
9 河南省 NULL
10 大郭村南 8
11 大郭村北 8
12 北焦村东 7
13 北焦村西 7
14 桥东区 3
15 桥西区 3
我需要一个标量值函数,输入ID,递归至顶,输出“包括自己在内的所有父节点ID”
oracle搞多了,sql忘了个干净,请各位帮忙了
例如输入桥西区的ID(15),得到的结果是“15,3,1”(逗号分隔)
再提醒一下:我需要的是一个“标量值函数”,而不是“表值函数”,有劳各位了! 展开
8个回答
展开全部
*************
函数如下,请根据你自己的实际情况,把汉字换成相应的具体信息
*************
CREATE FUNCTION 函数名( @id AS varchar(2)) RETURNS varchar(1000) AS
BEGIN
DECLARE @tmp VARCHAR(1000)
IF @id IS NOT NULL
BEGIN
SELECT @tmp=@id+','+isnull(dbo.函数名(第三列字段),'') FROM [表名] WHERE [第一列字段] = @id
END
RETURN @tmp
END
***********
调用方法:
***********
SELECT substring(dbo.函数名('15'),1,len(dbo.函数名('15'))-1)
**********
给你个我测试的截图,参考
**********
---
以上,希望对你有所帮助。
展开全部
如果是Oracle数据库,那么有递归函数可以实现SQL语句。
Start
with...connect
by
prior
..
Start
with...connect
by
prior
..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你确定要的是函数吧!
有一个值就够啦!如果返回0则表示无此查询
create function idd(@fu_id)
returns varchar(5)
as
begin
declare @fu_idd varchar(5)
set @fu_idd=(select 区ID from 父表 where 父表ID=@fu_id)
set @fu_idd=isnull(@fu_idd,'0')
return @fu_idd
end
函数没回只能返回一个值!
你要递归她最终也只是返回一个值而已!
你要是执行函数的时候递归么?
有一个值就够啦!如果返回0则表示无此查询
create function idd(@fu_id)
returns varchar(5)
as
begin
declare @fu_idd varchar(5)
set @fu_idd=(select 区ID from 父表 where 父表ID=@fu_id)
set @fu_idd=isnull(@fu_idd,'0')
return @fu_idd
end
函数没回只能返回一个值!
你要递归她最终也只是返回一个值而已!
你要是执行函数的时候递归么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实这个只是一个循环的问题,我说下思路。
1:建立一个临时表,这个是用来存储“包括自己在内的所有父节点ID”的。
2:那就是循环查询并复制给一个变量,并且把这个值插入到临时表里(注意中间需要判断父节点是否为NULL,如果为NULL,则插入退出,但是不要忘记把这个值插入到临时表里)。
1:建立一个临时表,这个是用来存储“包括自己在内的所有父节点ID”的。
2:那就是循环查询并复制给一个变量,并且把这个值插入到临时表里(注意中间需要判断父节点是否为NULL,如果为NULL,则插入退出,但是不要忘记把这个值插入到临时表里)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
declare @a table (TC_Id int,TC_PID int,TC_Name varchar(200))
insert @a values(1,0,'中国')
insert @a values(2,0,'美国')
insert @a values(3,0,'加拿大')
insert @a values(4,1,'北京')
insert @a values(5,1,'上海')
insert @a values(6,1,'江苏')
insert @a values(7,6,'苏州')
insert @a values(8,7,'常熟')
insert @a values(9,6,'南京')
insert @a values(10,6,'无锡')
insert @a values(11,2,'纽约')
insert @a values(12,2,'旧金山')
declare @tmp1 table (TC_Id int,TC_PID int,TC_Name varchar(200),lev int)
insert @tmp1 select *,8 from @a where tc_ID=8
while exists(select 8 from @a a,@tmp1 b where a.tc_ID=b.tc_pid and a.tc_ID not in (select tc_ID from @tmp1))
insert @tmp1 select a.*,8 from @a a,@tmp1 b where a.tc_ID=b.tc_pid and a.tc_ID not in (select tc_ID from @tmp1)
select * from @tmp1
不知道从哪儿抄来的,你试试
insert @a values(1,0,'中国')
insert @a values(2,0,'美国')
insert @a values(3,0,'加拿大')
insert @a values(4,1,'北京')
insert @a values(5,1,'上海')
insert @a values(6,1,'江苏')
insert @a values(7,6,'苏州')
insert @a values(8,7,'常熟')
insert @a values(9,6,'南京')
insert @a values(10,6,'无锡')
insert @a values(11,2,'纽约')
insert @a values(12,2,'旧金山')
declare @tmp1 table (TC_Id int,TC_PID int,TC_Name varchar(200),lev int)
insert @tmp1 select *,8 from @a where tc_ID=8
while exists(select 8 from @a a,@tmp1 b where a.tc_ID=b.tc_pid and a.tc_ID not in (select tc_ID from @tmp1))
insert @tmp1 select a.*,8 from @a a,@tmp1 b where a.tc_ID=b.tc_pid and a.tc_ID not in (select tc_ID from @tmp1)
select * from @tmp1
不知道从哪儿抄来的,你试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询