在SQL中连接复杂select中的行
RDBMS是SQL Server 2008 我有三张桌子。为了简化,它们如下所示:在SQL中连接复杂select中的行,sql,sql-server,sql-server-2008,concatenation,Sql,Sql Server,Sql Server 2008,Concatenation,RDBMS是SQL Server 2008 我有三张桌子。为了简化,它们如下所示: NominationId | NominationOrderId | GiftName 5 | 1 | TVSet 5 | 1 | TabletPC 5 | 1 | LittlePonny Nomination
NominationId | NominationOrderId | GiftName
5 | 1 | TVSet
5 | 1 | TabletPC
5 | 1 | LittlePonny
NominationId | NominationOrderId | GiftName
5 | 1 | TVSet, TabletPC, LittlePonny
提名顺序
表格:
NominationOrderId | NominationId
1 | 5
2 | 9
NominationOrderItemId | NominationOrderId | GiftId
1 | 1 | 6
2 | 1 | 3
3 | 1 | 9
GiftId | GiftName |
3 | TVSet
6 | TabletPC
9 | LittlePonny
提名顺序表
表格:
NominationOrderId | NominationId
1 | 5
2 | 9
NominationOrderItemId | NominationOrderId | GiftId
1 | 1 | 6
2 | 1 | 3
3 | 1 | 9
GiftId | GiftName |
3 | TVSet
6 | TabletPC
9 | LittlePonny
礼品
表格:
NominationOrderId | NominationId
1 | 5
2 | 9
NominationOrderItemId | NominationOrderId | GiftId
1 | 1 | 6
2 | 1 | 3
3 | 1 | 9
GiftId | GiftName |
3 | TVSet
6 | TabletPC
9 | LittlePonny
所以,有一些提名。每个提名
可以有1个提名顺序
。每个提名订单
可能有许多提名订单项目
,每个项目都引用了此订单中的一些礼物
我正在为Reporting Services制作一份报告,我需要在一行中显示有关每个提名的数据,显示连接的Gift
姓名
现在看起来是这样的:
NominationId | NominationOrderId | GiftName
5 | 1 | TVSet
5 | 1 | TabletPC
5 | 1 | LittlePonny
NominationId | NominationOrderId | GiftName
5 | 1 | TVSet, TabletPC, LittlePonny
我需要它看起来像这样:
NominationId | NominationOrderId | GiftName
5 | 1 | TVSet
5 | 1 | TabletPC
5 | 1 | LittlePonny
NominationId | NominationOrderId | GiftName
5 | 1 | TVSet, TabletPC, LittlePonny
当前SQL查询的简化示例:
select
nn.NominationId
,n_o.NominationOrderId
,g.name GiftName
from dbo.Nomination nn
LEFT JOIN dbo.NominationOrder n_o ON n_o.NominationId = nn.NominationId
LEFT JOIN dbo.NominationOrderItem noi ON noi.NominationOrderId = n_o.NominationOrderId
left join dbo.Gift g on g.GiftId = noi.GiftId
我如何重写它以在单个字符串中生成输出并连接礼物名称?您可以使用CTE:
WITH cteTbl (NominationId, NominationOrderId, GiftName) AS ( Your Query here)
然后将所有具有相同namignionId
和namignionOrderId
的行连接到的XML路径(“”)
,然后将第一个逗号,
替换为STUFF
:
SELECT t.NominationId
, t.NominationOrderId
, STUFF( ( SELECT ', ' + GiftName
FROM cteTbl
WHERE NominationId = t.NominationId
AND NominationOrderId = t.NominationOrderId
ORDER BY GiftName DESC
FOR XML PATH('') ), 1, 1, '')
FROM cteTbl t
GROUP BY t.NominationId
, t.NominationOrderId
您可以使用CTE:
WITH cteTbl (NominationId, NominationOrderId, GiftName) AS ( Your Query here)
然后将所有具有相同namignionId
和namignionOrderId
的行连接到的XML路径(“”)
,然后将第一个逗号,
替换为STUFF
:
SELECT t.NominationId
, t.NominationOrderId
, STUFF( ( SELECT ', ' + GiftName
FROM cteTbl
WHERE NominationId = t.NominationId
AND NominationOrderId = t.NominationOrderId
ORDER BY GiftName DESC
FOR XML PATH('') ), 1, 1, '')
FROM cteTbl t
GROUP BY t.NominationId
, t.NominationOrderId
你在使用什么RDBMS?@Mureinik,这是MSSQL 2008,请注意!第四个表格在哪里?
提名
?每个提名ID
可以有多少礼物?你在使用什么RDBMS?@Mureinik,这是MSSQL 2008,通知的thx!第四个表格在哪里?提名
?每个提名ID
可以获得多少礼物?