SQL Server 使用多对多相关表连接行

标签 sql sql-server many-to-many string-concatenation

我已经搜索过我的问题,但大多数示例(如果不是全部)都必须处理仅一两个表,它们之间具有一对多关系。 所以,这是我的场景:

我的第一个表是:

OrderID Quantity    Price
----------------------------------
18      1000.00     160.00
19      1000.00     40.00
22      1000.00     40.00
23      100.00      500.00
24      10.00       50.00

我的第二个表是:

ExtrasID    Name
-------------------
1           Value 1
2           Value 2
3           Value 3
4           Value 4
5           Value 5

我在上面的表之间建立了多对多关系,因此有第三个(联合)表,如下所示:

OrderExtrassID  OrderExtras_OrderID OrderExtras_ExtrasID
----------------------------------------------------------------
20              19                  2
22              22                  3
23              23                  2
24              23                  5

现在,我想要实现的就是获得如下结果:

OrderID Extras
----------------------------
18      NULL
19      Value 2
22      Value 3
23      Value 2, Value 5
24      NULL

有很多使用 XML PATH、PIVOT、CTE 等的示例,但这些似乎都对我的场景没有帮助,或者至少我没有设法深入研究它们,以便完成我的工作...

提前致谢,

最佳答案

我建议使用 For XML 将多行返回到单行中,然后使用 STUFF 删除多余的逗号。像这样的事情:

SELECT O.OrderId
 ,STUFF(
        (
            SELECT ',' + E.Name AS [text()]
                FROM OrderExtras OE
                    Inner Join Extras E 
                        ON E.ExtrasId = OE.OrderExtras_ExtrasID
                WHERE O.OrderId = OE.OrderExtras_OrderID
            ORDER BY E.Name
            FOR XML PATH('')
        ), 1, 1, '') AS ColList
FROM Orders O

这是SQL Fiddle .

祝你好运。

关于SQL Server 使用多对多相关表连接行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14488401/

相关文章:

mysql - 连接mysql中的两列

sql-server - sql cross join - 有人发现它有什么用?

python - 将对象添加到 ManyToManyField 时,Django 如何填充 'trough' 中间模型中的字段?

mysql - 经常需要交集时存储多对多 SQL 关系的正确方法?

sql-server - SQL Server 2012 Web Management Studio - 所有选项在哪里?

excel - 连接两个在powerpivot中具有多对多关系的表

mysql - 如何在 MySQL 触发器中构造此 IF 条件

sql - PL/SQL 使用哪种类型的绑定(bind)?

sql - 在 MySQL 中使用文本而不是 varchar 类型的实际性能影响是什么?

sql-server - SQL 按时间/小时过滤查询