SQL使用游标遍历更新树(3层)

例子:需要将一个具有三层父子关系的表,更新列为树节点信息,更新bm列入下图

直接使用SQL游标遍历表数据,依次读取parent和id,进行Update即可;

实现代码如下:

---测试数据
create table tree_base(id int,parent int,bm varchar(200))
insert into tree_base(id,parent)
select 1,-1
union all
select 2,1
union all
select 3,1
union all
select 4,2
union all
select 6,2
union all
select 7,3
union all
select 8,3

declare @pid int;
declare @nid int;
declare @count int;
 --首先根节点只有一个,置为001
  update tree_base set bm= '00'+cast(1 as varchar) where parent not in  (select id from parent)
 --然后循环取parent_id和id,并循环更新;
  declare curson_name cursor for
     select id, parent from tree_base where bm is  null order by parent,id;
  open curson_name
  fetch next from curson_name into @nid,@pid
  while @@FETCH_STATUS=0
  begin
    --获取最后是相同节点下的第几个;
    select @count=count(1)+1 from tree_base where parent=@pid and bm is not null
	--bm由两部分构成,第一部分是父的bm,第二部分是同级第几个赋值
    update tree_base 
	set bm=(select bm from tree_base where id=@pid )
	+  right(('00'+ cast(@count as varchar(2))),3)
	where id=@nid
	--print @count
	--print @nid
	fetch next from curson_name into @nid,@pid
  end
  close curson_name
  deallocate curson_name

--select * from tree_base
--update tree_base set bm=null

知乎原文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQL 中,可以使用游标(CURSOR)来遍历整张表。游标可以在查询结果集上进行操作,类似于在程序中使用指针来遍历数据。 以下是一个遍历整张表的示例: ```sql DECLARE @id INT, @name VARCHAR(50) DECLARE cursor_name CURSOR FOR SELECT id, name FROM table_name OPEN cursor_name FETCH NEXT FROM cursor_name INTO @id, @name WHILE @@FETCH_STATUS = 0 BEGIN -- 执行需要循环的操作 PRINT 'id: ' + CONVERT(VARCHAR, @id) + ', name: ' + @name FETCH NEXT FROM cursor_name INTO @id, @name END CLOSE cursor_name DEALLOCATE cursor_name ``` 以上代码中,首先使用 DECLARE 语句声明了两个变量 `@id` 和 `@name`,用于存储查询结果中的 `id` 和 `name`。然后使用 DECLARE CURSOR 语句声明一个游标 `cursor_name`,并使用 SELECT 语句查询整张表中的数据。接着使用 OPEN 语句打开游标,并使用 FETCH NEXT 语句将游标定位到第一行数据,将查询结果中的 `id` 和 `name` 分别赋值给变量 `@id` 和 `@name`。 在 WHILE 循环中,首先判断当前 FETCH 语句的执行状态 `@@FETCH_STATUS` 是否为 0,如果是,则继续执行循环体内的操作。在循环体内,可以执行需要循环的操作,例如打印当前行数据。然后使用 FETCH NEXT 语句将游标定位到下一行数据,再次将查询结果中的 `id` 和 `name` 分别赋值给变量 `@id` 和 `@name`。 在循环结束后,需要使用 CLOSE 语句关闭游标,并使用 DEALLOCATE 语句释放游标所占用的资源。 需要注意的是,游标使用可能会影响查询性能,所以在实际应用中需要谨慎使用。同时,游标的语法和使用方法可能会因不同的数据库而有差异,以上代码仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向阳的花儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值