首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于集合的方法来计算SQL中的家庭范围?

基于集合的方法来计算SQL中的家庭范围?
EN

Stack Overflow用户
提问于 2013-12-06 06:44:24
回答 1查看 77关注 0票数 0

我有一个表,其中包含父级和每个父级的0或多个子级,并有指示哪些记录是父级的标志。给定家庭的所有成员都具有相同的父id,而父成员在给定家庭中的id始终是最低的。而且,每个子程序都有一个与其相关的值。(具体来说,这是一个电子邮件和附件的数据库,其中每个家长都是电子邮件,孩子是附件。)

我有两个需要计算的字段:

Range ={家庭中的最低id }-{家庭中的最高id }为所有成员填充

值- list ={分隔的每个子项的值的列表,按id顺序}仅用于父级。

因此,鉴于这一点:

代码语言:javascript
复制
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      |       |       |  

我最后想说的是:

代码语言:javascript
复制
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,如果这有什么区别的话,尽管我会好奇地看到平台无关的答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-06 10:31:24

下面的SQLFiddle解应该为您完成这项工作,但是正如@Allan所提到的,您可能需要修改您的数据库结构。

使用CTE的:注意:我的查询使用table1作为表的名称

代码语言:javascript
复制
     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 t1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20417712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档