使用多个连接将行连接成字符串时遇到问题

Posted

技术标签:

【中文标题】使用多个连接将行连接成字符串时遇到问题【英文标题】:Trouble concatenating rows into string with multiple joins 【发布时间】:2019-11-21 20:20:50 【问题描述】:

我正在努力在雪花模式中创建语句。我需要显示所有产品和相关曲目的列表,但还需要在每行中包含歌曲作者姓名和所有权百分比的列表,例如。添加一列,如下所示:“Sam Smith (50.00%)、Sally Simpson (25.00%)、John Chan (25.00%)”。我的桌子是:

Table: PRODUCT -PRODUCT_ID -ALBUM_ARTIST -ALBUM_TITLE

Table: SONGWRITER -SONGWRITER_ID -FIRSTNAME -LASTNAME

Table: SONG_SONGWRITER -SONGWRITER_ID -TRACK_ID -OWNERSHIP_SHARE

Table: TRACK -TRACK_ID -PRODUCT_ID -TRACK_ARTIST |TRACK_NAME

我知道我需要连接(并连接)SONG_SONGWRITER 和 SONGWRITER 表,但由于显示产品和曲目所需的多个连接,我非常迷茫。

我已经尝试过(但失败了):

SELECT prod.*, tra.TRACK_NAME,(SELECT (SELECT ','+ writer.FIRSTNAME +' ' +writer.LASTNAME + '(' + FORMAT(ssw.OWNERSHIP_SHARE,'P2') + ')' FROM SONGWRITER writer INNER JOIN SONG_SONGWRITER ssw ON ssw.SONGWRITER_ID=writer.SONGWRITER_ID FOR XML PATH ('')))
FROM PRODUCT prod
INNER JOIN TRACK tra
ON tra.PRODUCT_ID=prod.PRODUCT_ID
ORDER BY tra.SEQUENCE;

至于预期的结果,它应该有希望返回如下内容:

PRODUCT_ID |专辑艺术家 | ALBUM_TITLE |跟踪名称 |所有权

1 |肉饼 |蝙蝠出地狱 |蝙蝠出地狱 |肉饼 (50%),约翰尼词曲作者 (50%

有人可以帮忙吗?

【问题讨论】:

更新你的问题添加一个连贯的数据样本和预期的结果(作为表格文本) 你使用的是雪花还是 sql-server?这些是不同的产品。 @GMB 在这个上使用雪花。 至于预期的结果,它应该有希望返回如下内容:PRODUCT_ID |专辑艺术家 | ALBUM_TITLE |跟踪名称 |所有权 1 |肉饼 |蝙蝠出地狱 |蝙蝠出地狱 |肉饼 (50%),约翰尼词曲作者 (50%) 【参考方案1】:

您可以加入 4 个表并打开聚合。在雪花中,listagg() 可用于聚合字符串:

select 
    p.product_id
    p.album_artist,
    p.album_title,
    t.track_name,
    listagg(concat(s.firstname, ' ', s.lastname, ' (', ss.ownership_share, ')') 
        within group (order by ss.ownership_share) ownership_share
from product p
inner join track t on t.product_id = p.product_id
inner join song_songwriter ss on ss.track_id = p.track_id
inner join songwriter s on s.songwriter_id = ss.songwriter_id
group by
    p.product_id
    p.album_artist,
    p.album_title,
    t.track_name
order by p.product_id, t.sequence;

【讨论】:

【参考方案2】:

连接字符串时,Snowflake 不使用“+”符号。您应该利用 concat() 函数或 ||符号:

https://docs.snowflake.net/manuals/sql-reference/functions/concat.html

【讨论】:

以上是关于使用多个连接将行连接成字符串时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

访问将行连接成单行:需要额外的条件

SQL 将行连接成一个字段 (DB​​2)

在编写具有多个连接的查询时遇到问题

如何在 Meson 中将多个文件连接成一个文件?

使用d2rq遇到的数据库连接问题[重复]

Hive 中的多个表连接出现错误 - 连接中遇到左右别名