我有这个问题,我想使用一个只在某些条件下发生变化的变量...
1 Item1 <parent>
2 Item2 <child>
3 Item3 <child>
4 Item4 <child>
5 Item5 <parent>
6 Item6 <child>
我有一个数据表,一旦你选择了父项,它就会填充它下面的相关子项。 我遇到的问题是,我想识别子项所属的父项 - 数据中唯一的方法是它们到达的顺序(即每个子项是最后一个父项的子项)序列)
如果我可以使用变量 - 那么我可以在每次识别父项时将值分配给变量 - 并在每行上打印出该变量的值。像这样:
1 Item1 <parent> Item1
2 Item2 <child> Item1
3 Item3 <child> Item1
4 Item4 <child> Item1
5 Item5 <parent> Item5
6 Item6 <child> Item5
所以我知道每个孩子属于哪个父母。无论如何,我认为我可以获得类似上面的输出(我需要使用视图,因为我想最终在水晶报表中链接输出)
作为以下评论的后续跟进...这就是我希望代码在我的系统上为多个订单工作的方式,希望它有意义!
with
parent_ranges as(
select SOHNUM_0,ITMREF_0 as ITM, SOPLIN_0, LEAD(SOPLIN_0, 1, NULL) over (order by SOHNUM_0,SOPLIN_0) NX
from <MY_DB>.SORDERP with (nolock)
where LINTYP_0 = 6 –Parent
--and SOHNUM_0 = '<My Order Number>'
)
select case when t1.LINTYP_0 in (6,7,8,9) then isnull(t2.ITM,'?') else 'NO' end as PARENT_ITEM, t1.LINTYP_0,t1.ITMREF_0
from <MY_DB>.SORDERP t1 with (nolock)
left join parent_ranges t2 on (t1.SOHNUM_0 = t2.SOHNUM_0 and t1.SOPLIN_0 >= t2.SOPLIN_0 and ((t1.SOPLIN_0 < t2.NX) OR t2.NX IS NULL))
where t1.SOHNUM_0 = '<My Order Number>'
你能看到一种我不需要的方式 - 和SOHNUM_0 ='' 在视图中划线?
答案 0 :(得分:0)
从sql-server 2012,您可以使用LEAD
功能:
;with
parent_ranges as(
select *, LEAD(id, 1, NULL) over (order by id) NX
from @tbl
where kind = 'parent'
)
select T1.*, T2.Item PARENT_ITEM
from @tbl t1
left join parent_ranges t2 on t1.id >= t2.ID and (t1.id < t2.NX OR t2.NX IS NULL)