【发布时间】:2019-11-26 22:39:31
【问题描述】:
我知道我的问题听起来很笼统,但我无法在不写段落的情况下指定标题中的所有细节。我会尽量在这里直截了当。
我有一个表单/订购表单项的数据库表。每个表单项都可以缩进一个特定的“级别”。例如,缩进级别 (IL) = 0 的所有行都是该表单上的顶级项目。如果 IL = 1,并且直接出现在 IL = 0 行之后,则 IL1 行的父行将是之前的 IL0 行。但是,可以有 X 个 IL1 项目,其父项都是相同的前一个 IL0。这种模式可以持续到 6 级嵌套(IL6 的父级将是之前的 IL5)
这是一个表单示例,我手动填写了正确的 ParentItemID(这是我试图动态计算的列):
ItemID FormID SortOrder Indent Description ParentItemID
1000 1 1 0 Main Item 1 NULL
1001 1 2 0 Main Item 2 NULL
1002 1 3 1 Sub Item 1 1001
1003 1 4 1 Sub Item 2 1001
1004 1 5 2 Sub Item 2-1 1003
1005 1 6 2 Sub Item 2-2 1003
1006 1 7 2 Sub Item 2-3 1003
1007 1 8 3 Sub Item 2-3-1 1006
1008 1 9 1 Sub Item 3 1001
1009 1 10 0 Main Item 3 NULL
这是从数据库中的原始数据实际转换为表单时的样子,就像一个视觉示例:
我正在尝试使用 LAG,它适用于第一个 IL1 项目,但从那里开始,以下每个项目都引用了前一行。我想我可以运行一堆更新,只过滤到每个缩进级别,但这并不理想。我看到 LAG 采用一个偏移参数,但由于某种原因,我无法理解如何动态计算它以始终引用缩进级别小于 1 的前一项(基于排序顺序)当前缩进级别。
这里是创建表和填充数据的 sql:
create table FormItems(
ItemID int,
FormID int,
SortOrder int,
Indent int,
Description nvarchar(100),
ParentItemID int
)
insert into FormItems
select 1000, 1, 1 , 0, 'Main Item 1' ,NULL union
select 1001, 1, 2 , 0, 'Main Item 2' ,NULL union
select 1002, 1, 3 , 1, 'Sub Item 1' ,1001 union
select 1003, 1, 4 , 1, 'Sub Item 2' ,1001 union
select 1004, 1, 5 , 2, 'Sub Item 2-1' ,1003 union
select 1005, 1, 6 , 2, 'Sub Item 2-2' ,1003 union
select 1006, 1, 7 , 2, 'Sub Item 2-3' ,1003 union
select 1007, 1, 8 , 3, 'Sub Item 2-3-1' ,1006 union
select 1008, 1, 9 , 1, 'Sub Item 3' ,1001 union
select 1009, 1, 10, 0, 'Main Item 3' ,NULL
【问题讨论】:
标签: sql database tsql hierarchy lag