sql 提交

baidu_33205758 2015-12-01 09:18:00
问题:提交:在本级党组织信息变化的情况下,从本级到上级所有党组织(直至最顶层)的基本信息都必须进行相应的变化(采用数据库存储过程进行处理,保证处理的速度),并且更新相应党组织信息中“更新时间”数据项的值。

一个党务数据库 提交的时候 要求用递归提交 意思是 下级党组织人数有变化的时候 父级党组织的党员数随之变化
下面是我用循环写的 老师让用递归写一遍 求大神指教
--提交 提交
create procedure huizong
@ID int
as
--声明变量
declare @Father varchar(20)
declare @sum varchar(20)
declare @time datetime=getdate()
begin
--执行操作
while(@ID > 0)
BEGIN
--对变量赋值;
select @Father = ParentID from T_Party where @ID=id;
select @sum = SUM(党员数) from T_Party where @Father=ParentID ;
--(有兄弟)直接相加更新到父亲
if(@Father>0)
begin
UPDATE T_Party SET 党员数 = @sum WHERE @Father = id;
update T_Party set 更新时间=@time where id=@ID;
set @ID = @Father;
end;
--(如果没有兄弟)直接将此数据更新到父亲
else
break;
end
end
...全文
145 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
可以参考一下这个; 在论坛中出现的比较难的sql问题:21(递归问题3) http://blog.csdn.net/sqlserverdiscovery/article/details/18363633 里面写了2中方法,第二种方法,你改造一下,做出一个函数就ok了
回复
baidu_33205758 2015-12-03
引用 7 楼 Landa_Ran 的回复:
[quote=引用 6 楼 baidu_33205758 的回复:] [quote=引用 2 楼 Landa_Ran 的回复:]
--CREATE TABLE T_Party
--(
--	ID INT,
--	ParentID INT,
--	COUNTPERSON INT
--)
--INSERT INTO T_Party
--SELECT 1,0,9 UNION ALL
--SELECT 2,0,7 UNION ALL
--SELECT 3,1,4 UNION ALL
--SELECT 4,1,5 UNION ALL
--SELECT 5,3,3 UNION ALL
--SELECT 6,5,1 UNION ALL
--SELECT 7,5,2
DECLARE @ID INT=7	--更新的党组织ID

;WITH CTE AS (
	/*递归获取上级所有党组织*/
	SELECT ID,ParentID,COUNTPERSON,1 AS [LEVEL] FROM T_Party WHERE ID=@ID
	UNION ALL
	SELECT a.ID,a.ParentID,a.COUNTPERSON,b.[LEVEL]+1 AS [LEVEL]
	FROM T_Party a
	JOIN CTE b ON b.ParentID=a.ID
)
UPDATE T_Party SET COUNTPERSON=CTE.COUNTPERSON+1 FROM CTE WHERE CTE.ID=T_Party.ID
亲 这个事对的 但是这个有些难理解 可以写一个函数调用函数的递归吗 谢谢[/quote] 你可以把这个语句封装成函数;不能写通用的递归函数[/quote] 你可以写出来让我理解理解吗
回复
baidu_33205758 2015-12-03
引用 1 楼 szx1999 的回复:
create procedure huizong
@ID int
as
--声明变量
declare @Father varchar(20)
  
;with cte as
(
	select id=@Father,党员数=(select SUM(党员数) from T_Party where ParentID=@Father)
	union all
	select a.id,党员数=(select SUM(党员数) from T_Party where ParentID=a.id) from T_Party a,cte b where a.id=b.ParentID
)
update T_Party
set 党员数=t.党员数
from cte t
where T_Party.id=t.id
go
cte b where a.id=b.ParentID 这个b.parentid 有错误 求解
回复
许晨旭 2015-12-03
引用 6 楼 baidu_33205758 的回复:
[quote=引用 2 楼 Landa_Ran 的回复:]
--CREATE TABLE T_Party
--(
--	ID INT,
--	ParentID INT,
--	COUNTPERSON INT
--)
--INSERT INTO T_Party
--SELECT 1,0,9 UNION ALL
--SELECT 2,0,7 UNION ALL
--SELECT 3,1,4 UNION ALL
--SELECT 4,1,5 UNION ALL
--SELECT 5,3,3 UNION ALL
--SELECT 6,5,1 UNION ALL
--SELECT 7,5,2
DECLARE @ID INT=7	--更新的党组织ID

;WITH CTE AS (
	/*递归获取上级所有党组织*/
	SELECT ID,ParentID,COUNTPERSON,1 AS [LEVEL] FROM T_Party WHERE ID=@ID
	UNION ALL
	SELECT a.ID,a.ParentID,a.COUNTPERSON,b.[LEVEL]+1 AS [LEVEL]
	FROM T_Party a
	JOIN CTE b ON b.ParentID=a.ID
)
UPDATE T_Party SET COUNTPERSON=CTE.COUNTPERSON+1 FROM CTE WHERE CTE.ID=T_Party.ID
亲 这个事对的 但是这个有些难理解 可以写一个函数调用函数的递归吗 谢谢[/quote] 你可以把这个语句封装成函数;不能写通用的递归函数
回复
baidu_33205758 2015-12-03
引用 2 楼 Landa_Ran 的回复:
--CREATE TABLE T_Party
--(
--	ID INT,
--	ParentID INT,
--	COUNTPERSON INT
--)
--INSERT INTO T_Party
--SELECT 1,0,9 UNION ALL
--SELECT 2,0,7 UNION ALL
--SELECT 3,1,4 UNION ALL
--SELECT 4,1,5 UNION ALL
--SELECT 5,3,3 UNION ALL
--SELECT 6,5,1 UNION ALL
--SELECT 7,5,2
DECLARE @ID INT=7	--更新的党组织ID

;WITH CTE AS (
	/*递归获取上级所有党组织*/
	SELECT ID,ParentID,COUNTPERSON,1 AS [LEVEL] FROM T_Party WHERE ID=@ID
	UNION ALL
	SELECT a.ID,a.ParentID,a.COUNTPERSON,b.[LEVEL]+1 AS [LEVEL]
	FROM T_Party a
	JOIN CTE b ON b.ParentID=a.ID
)
UPDATE T_Party SET COUNTPERSON=CTE.COUNTPERSON+1 FROM CTE WHERE CTE.ID=T_Party.ID
亲 这个事对的 但是这个有些难理解 可以写一个函数调用函数的递归吗 谢谢
回复
baidu_33218847 2015-12-02
引用
4
谢谢 写的太好了 可以用变量调用变量的递归思想实现这个问题效果吗 麻烦指点指点
回复
--小F-- 2015-12-02
引用 3 楼 baidu_33218847 的回复:
@Landa_Ran 二楼 我想问一下 SELECT ID,ParentID,COUNTPERSON,1 AS [LEVEL] FROM T_Party WHERE ID=@ID 这个1 是什么意思 您能给我解释一遍这个程序的怎么走吗 过程 谢谢 递归用的不太好
这个建议你去看看CTE的定义 。这句话叫做定位点节点
回复
baidu_33218847 2015-12-02
@Landa_Ran 二楼 我想问一下 SELECT ID,ParentID,COUNTPERSON,1 AS [LEVEL] FROM T_Party WHERE ID=@ID 这个1 是什么意思 您能给我解释一遍这个程序的怎么走吗 过程 谢谢 递归用的不太好
回复
许晨旭 2015-12-01
--CREATE TABLE T_Party
--(
--	ID INT,
--	ParentID INT,
--	COUNTPERSON INT
--)
--INSERT INTO T_Party
--SELECT 1,0,9 UNION ALL
--SELECT 2,0,7 UNION ALL
--SELECT 3,1,4 UNION ALL
--SELECT 4,1,5 UNION ALL
--SELECT 5,3,3 UNION ALL
--SELECT 6,5,1 UNION ALL
--SELECT 7,5,2
DECLARE @ID INT=7	--更新的党组织ID

;WITH CTE AS (
	/*递归获取上级所有党组织*/
	SELECT ID,ParentID,COUNTPERSON,1 AS [LEVEL] FROM T_Party WHERE ID=@ID
	UNION ALL
	SELECT a.ID,a.ParentID,a.COUNTPERSON,b.[LEVEL]+1 AS [LEVEL]
	FROM T_Party a
	JOIN CTE b ON b.ParentID=a.ID
)
UPDATE T_Party SET COUNTPERSON=CTE.COUNTPERSON+1 FROM CTE WHERE CTE.ID=T_Party.ID
回复
等不到来世 2015-12-01
create procedure huizong
@ID int
as
--声明变量
declare @Father varchar(20)
  
;with cte as
(
	select id=@Father,党员数=(select SUM(党员数) from T_Party where ParentID=@Father)
	union all
	select a.id,党员数=(select SUM(党员数) from T_Party where ParentID=a.id) from T_Party a,cte b where a.id=b.ParentID
)
update T_Party
set 党员数=t.党员数
from cte t
where T_Party.id=t.id
go
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-12-01 09:18
社区公告
暂无公告