我有一个表,其中包含父级和每个父级的0或多个子级,并有指示哪些记录是父级的标志。给定家庭的所有成员都具有相同的父id,而父成员在给定家庭中的id始终是最低的。而且,每个子程序都有一个与其相关的值。(具体来说,这是一个电子邮件和附件的数据库,其中每个家长都是电子邮件,孩子是附件。)
我有两个需要计算的字段:
Range ={家庭中的最低id }-{家庭中的最高id }为所有成员填充
值- list ={分隔的每个子项的值的列表,按id顺序}仅用于父级。
因此,鉴于这一点:
Id | Parent| HasChildren| Value | Range | Value-list
----------------------------------------|-----------
1 | 1 | 1 | | |
2 | 1 | 0 | a | |
3 | 1 | 0 | b | |
4 | 4 | 1 | | |
5 | 4 | 0 | c | |
6 | 6 | 0 | | | 我最后想说的是:
Id | Parent| HasChildren| Value | Range | Value-list
----------------------------------------|-----------
1 | 1 | 1 | | 1-3 | a;b
2 | 1 | 0 | a | 1-3 |
3 | 1 | 0 | b | 1-3 |
4 | 4 | 1 | | 4-5 | c
5 | 4 | 0 | c | 4-5 |
6 | 6 | 0 | | 6-6 | 我怎样才能有效地做到这一点?理想情况下,我希望只使用基于集合的逻辑,没有游标,甚至存储过程。临时桌子可以。
我正在使用to,如果这有什么区别的话,尽管我会好奇地看到平台无关的答案。
发布于 2013-12-06 10:31:24
下面的SQLFiddle解应该为您完成这项工作,但是正如@Allan所提到的,您可能需要修改您的数据库结构。
使用CTE的:注意:我的查询使用table1作为表的名称
with cte as(
select parent
,ValueList= stuff(( select ';' +isnull(t2.Value, '')
from table1 t2
where t1.parent=t2.parent
order by t2.value
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
from table1 t1
group by parent
),
cte2 as (select parent
, min(id) as firstID
, max(id) as LastID
from table1
group by parent)
select *
,(select FirstID from cte2 t2 where t2.parent=t1.parent)+'-'+(select LastID from cte2 t2 where t2.parent=t1.parent) as [Range]
,(select ValueList from cte t2 where t1.parent=t2.parent and t1.[haschildren]='1') as [Value -List]
from table1 t1https://stackoverflow.com/questions/20417712
复制相似问题