选择前两行子表

时间:2017-01-05 22:36:16

标签: sql sql-server

我需要为父记录返回一行数据。父记录可以有许多子记录,但我只想要前两行(以及父记录的总行数)。

以下是数据示例:

ParentTable
+-----------------------+
| ParentId | ParentData |
+-----------------------+
|        1| Stuff       |
|        2| Things      |
|        3| Foo         |
|        4| Bar         |
-------------------------

ChildTable
+-------------------------------+
| ChildId | ParentId| ChildData |
+-------------------------------+
|       1 |       1 | Alpha     |
|       2 |       1 | Bravo     |
|       3 |       2 | Charlie   |
|       4 |       2 | Delta     |
|       5 |       2 | Echo      |
|       6 |       3 | Foxtrot   |
---------------------------------

这是我想要的结果:

+-----------------------------------------------------------------+
| ParentId | ParentData | ChildData1 | ChildData2 | ChildRowCount |
+-----------------------------------------------------------------+
|        1 | Stuff      | Alpha      | Bravo      |             2 |
|        2 | Things     | Charlie    | Delta      |             3 |
|        3 | Foo        | Foxtrot    | (NULL)     |             1 |
|        4 | Bar        | (NULL)     | (NULL)     |             0 |
-------------------------------------------------------------------

我不确定这是否需要某种子查询,临时表或某种JOIN或GROUP BY。

最后我需要在SSIS中使用它,但我从查询开始,然后从那里开始。

什么样的查询可以实现这一目标?

1 个答案:

答案 0 :(得分:3)

使用派生表对childdata表的行进行编号,并计算每个父项的子项数。 left join这个到父母表并获得所需的结果。

select distinct p.parentid,p.parentdata,
max(case when c.rnum =1 then c.childata end) over(partition by p.parentid,p.parentdata) as childdata1,
max(case when c.rnum =2 then c.childata end) over(partition by p.parentid,p.parentdata) as childdata2,
coalesce(c.childrowcount,0) as childrowcount
from parenttable p
left join (select c.*
           ,row_number() over(partition by parentid order by childid) as rnum
           ,count(*) over(partition by parentid) as childrowcount
           from childtable c) c
on c.parentid=p.parentid