我需要为父记录返回一行数据。父记录可以有许多子记录,但我只想要前两行(以及父记录的总行数)。
以下是数据示例:
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中使用它,但我从查询开始,然后从那里开始。
什么样的查询可以实现这一目标?
答案 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