问题描述
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,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
如果给定记录集(如1-> 2-> 3)存在ranklvl
的正确序列,则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