Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中连接复杂select中的行_Sql_Sql Server_Sql Server 2008_Concatenation - Fatal编程技术网

在SQL中连接复杂select中的行

在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

RDBMS是SQL Server 2008

我有三张桌子。为了简化,它们如下所示:

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
可以获得多少礼物?