sql - 获取表中的直接父子关系
问题描述
我有一个具有以下值的表
userid roleid ranklvl
123 a 1
456 b 2
789 c 3
我需要上述格式的输出数据:
userid roleid ranklvl parentroleid
123 a 1 null
456 b 2 a
789 c 3 b
提前感谢您对此的任何指导。
编辑:我使用 while 循环方法来实现这一点,但试图避免 while 循环。
declare @a table
(
userid int,roleid char(1),ranklvl int,parentroleid char(1) )
insert into @a(userid,roleid,ranklvl) select userid,roleid,ranklvl from Table [where some condition]
declare @maxcount smallint = (select max(ranklvl) from @a)
declare @counter smallint = 1
declare @parentroleid char(1)
while( @maxcount > @counter)
BEGIN
Select @parentroleid = roleid from @a where ranklvl = @maxcount - 1
UPDATE @a SET parentrole = @parentroleid where ranklvl = @maxcount
SET @maxcount = @maxcount -1
END
select * from @a
ranklvl
如果给定记录集(如 1->2->3)有正确的顺序,则 while 循环逻辑起作用。但如果数据采用以下方式,它就不起作用:
userid roleid ranklvl
123 a 1
789 c 3
以下预期结果不是由 while 循环逻辑得出的。
userid roleid ranklvl parentroleid
123 a 1 null
789 c 3 a
解决方案
我想你想要一个自我加入:
select t.*, p.roleid parentroleid
from mytable t
left join mytable p on p.ranklvl = t.ranklvl - 1
如果排序列有空格,可以先枚举:
with cte as (
select t.*, row_number() over(order by ranklvl) rn
from mytable t
)
select c.*, p.roleid parentroleid
from cte c
left join cte p on p.rn = c.rn - 1
推荐阅读
- docker - Docker-compose 无效。不允许附加属性
- typescript - 从 node_modules 导入项目根目录中的文件
- in-app-purchase - 如何制作应用内购买试用版应用
- r - 在组 id 中至少包含两行具有特定值的过滤器,并且列 a 至少具有两个不同的值
- javascript - JS检查是否显示为无
- pytorch - 如何使用分布式数据并行训练 AutoModelForQuestionAnswering 模型?
- javascript - 在组件的动态列表中更改下拉值时强制渲染功能组件-本机反应
- architecture - Salesforce CDC 事件过滤
- c# - 如何渲染作为属性传递的组件
- python - Django NoReverseMatch 在 /topic/pk=