首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将父级与同一行中的所有子级组合

如何将父级与同一行中的所有子级组合
EN

Database Administration用户
提问于 2018-09-14 03:30:14
回答 1查看 1.8K关注 0票数 3

SQL语句问题:我有两个表PARENTSTUDENTS

父表

代码语言:javascript
复制
ParentID | FName | LName | StudentID
---------+-------+-------+----------
       1 | John  | Doe   |        11
       1 | John  | Doe   |        12
       2 | Jane  | Doe   |        11
       2 | Jane  | Doe   |        12
       3 | Joe   | Dirt  |        13

学生表

代码语言:javascript
复制
StudentID | FName   | LName
----------+---------+------
       11 | Janet   | Doe
       12 | Jackson | Doe
       13 | Jane    | Dirt

预期的Outuput

代码语言:javascript
复制
ParentID | FName | LName | StudentID1 | Student1FName | StudentID2 | Student2FName |...
---------+-------+-------+------------+---------------+------------+---------------+---
       1 | John  | Doe   |         11 | Janet         |         12 | Jackson      
       2 | Jane  | Doe   |         11 | Janet         |         12 | Jackson      
       3 | Joe   | Dirt  |         13 | Jane          |       NULL | NULL   

我想要两个表的输出,但有时家长可能有两个以上的学生,有些可能只有一个。

我如何才能达到预期的结果集,但仍然灵活的学生在每个家长人数?

注:我对每个家长的学生人数没有一个明确的上限。

EN

回答 1

Database Administration用户

发布于 2018-09-16 07:32:33

这是一个解决方案,但在这个特殊情况下,每个家长的学生数量有限。我为3名学生写了这个查询。

代码语言:javascript
复制
with cteParent ( ParentID, FName, LName, StudentID )
as (
              select 1, 'John', 'Doe',  11
    union all select 1, 'John', 'Doe',  12
    union all select 2, 'Jane', 'Doe',  11
    union all select 2, 'Jane', 'Doe',  12
    union all select 3, 'Joe',  'Dirt', 13
) ,
cteStudent ( StudentID, FName, LName )
as (
              select 11, 'Janet', 'Doe'
    union all select 12, 'Jackson', 'Doe'
    union all select 13, 'Jane', 'Dirt'
) ,
cteParentNumbered
as (
    select p.ParentID
         , p.FName
         , p.LName
         , p.StudentID
         , row_number() over (partition by p.ParentID order by p.StudentID) as StudentNum
    from cteParent p
)
select 
       pvt.ParentID
     , pvt.FName
     , pvt.LName
     , s1.StudentID as Student1Id
     , s1.FName as Student1FName
     , s2.StudentID as Student2Id
     , s2.FName as Student2FName
     , s3.StudentID as Student3Id
     , s3.FName as Student3FName
from cteParentNumbered p
    pivot ( min (StudentID) FOR StudentNum IN  ( [1], [2], [3] /*... add more if needed */ ) ) AS pvt
    left join cteStudent as s1 on s1.StudentID = pvt.[1]
    left join cteStudent as s2 on s2.StudentID = pvt.[2]
    left join cteStudent as s3 on s3.StudentID = pvt.[3]
    --... you can add more if needed

要消除每个家长对学生的限制,您应该动态构建sql查询并通过服务提供商_执行者运行它,但它没有实际用途。这通常由客户端应用程序和/或报表引擎处理。例如,它可以在报表中显示为分层列表:

  1. 亲本1
    • 学生1
    • 学生2
    • ..。
    • 学生N

  2. 亲本2
    • 学生1
    • 学生2

  3. ..。
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/217582

复制
相关文章

相似问题

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