我知道我的问题听起来很普通,但是如果不编写段落就无法在标题中指定所有详细信息。我将在这里尝试使其简单明了。
我有一个表格/有序表格项目的数据库表。每个表单项都可以缩进特定的“级别”。例如,缩进级别(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接受了一个offset参数,但是由于某些原因,我无法绕开我如何动态地计算该值以始终引用缩进级别小于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
我知道我的问题听起来很普通,但是如果不编写段落就无法在标题中指定所有详细信息。我将在这里尝试使其简单明了。我有一个表格的数据库表/ ...
可能是最简单的方法: