如何使用数据引用的* _id字段分隔/格式化string_agg()聚合数据?

时间:2015-09-06 23:01:50

标签: sql postgresql relational-database string-aggregation

这个问题是我上一个问题的延续,可以找到here

This SQLFiddle正在使用数据库结构&我在下面描述的查询。

数据库看起来像:

CREATE TABLE artistnames (
    artistname_id       SERIAL  PRIMARY KEY,
    artistname          TEXT    UNIQUE NOT NULL
);

CREATE TABLE artistalias (
    artistalias_id      SERIAL  PRIMARY KEY,
    artistname_id       SERIAL  REFERENCES artistnames (artistname_id),
    artistalias         TEXT    UNIQUE NOT NULL
);

CREATE TABLE songs (
    song_id             SERIAL  PRIMARY KEY,
    song                TEXT    NOT NULL,
    artistalias_id      SERIAL  REFERENCES artistalias (artistalias_id)
);
  • 一位艺术家(表艺术家名称)可以有零个,一个或多个别名
  • 一个别名(表artsalias)属于一个艺术家
  • 一首歌(桌上歌曲)有一位或多位艺术家(并指的是他用来演唱这首歌的艺术家的别名)

实施例: 艺术家 Francis Veigar 也使用别名 Francis Fat Francis Fighter 。一首歌歌曲1 已经发布,艺术家名称为 Francis Veigar ,另一首歌歌曲2 他正在使用假冒 Francis Fat 和第三首歌歌曲3 他使用别名 Francis Fighter 和另一位名为 Peeka Boo 的艺术家一起演唱。

使用查询

SELECT
  string_agg(distinct(artistname), ' & ') AS artist_primary_name,
  string_agg(distinct(a1.artistalias), ' & ') AS performed_song_with_alias, 
  string_agg(a2.artistalias, ' & ') AS other_pseudonymes,
  song
FROM
  artistalias a1
  left JOIN artistalias a2 ON a2.artistname_id = a1.artistname_id
  left JOIN songs s ON s.artistalias_id = a1.artistalias_id
  left JOIN artistnames ON artistnames.artistname_id = a1.artistname_id
GROUP BY song;

显示other_pseudonymes列,如

+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| artist_primary_name        | performed_song_with_alias   | other_pseudonymes                                                  | song   |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar             | Francis Veigar              | Francis Veigar & Francis Fat & Francis Fighter                     | Song 1 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar             | Francis Fat                 | Francis Veigar & Francis Fat & Francis Fighter                     | Song 2 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar & Peeka Boo | Francis Fighter & Peeka Boo | Francis Veigar & Francis Fat & Francis Fighter & Peeka Boo & Peeka | Song 3 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Peeka Boo                  | Peeka                       | Peeka Boo & Peeka                                                  | Song 4 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+

我希望它看起来像

+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| artist_primary_name        | performed_song_with_alias   | other_pseudonymes                                                  | song   |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar             | Francis Veigar              | Francis Veigar & Francis Fat & Francis Fighter                     | Song 1 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar             | Francis Fat                 | Francis Veigar & Francis Fat & Francis Fighter                     | Song 2 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Francis Veigar & Peeka Boo | Francis Fighter & Peeka Boo | Francis Veigar & Francis Fat & Francis Fighter / Peeka Boo & Peeka | Song 3 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+
| Peeka Boo                  | Peeka                       | Peeka Boo                                                          | Song 4 |
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+

将两个不同艺术家正在使用的假名/别名分开'/'。在查询中需要更改哪些内容才能实现?

1 个答案:

答案 0 :(得分:1)

使用子查询,然后使用SELECT聚合元素并再次使用string_agg

SELECT
  string_agg(distinct(artistname), ' & ') AS artist_primary_name,
  string_agg(distinct(a1.artistalias), ' & ') AS performed_song_with_alias, 
  string_agg(distinct(col),' / ') AS other_pseudonymes,
  song
FROM
  artistalias a1
  left JOIN artistalias a2 ON a2.artistname_id = a1.artistname_id
  left JOIN songs s ON s.artistalias_id = a1.artistalias_id
  left JOIN artistnames ON artistnames.artistname_id = a1.artistname_id
  left join 
(SELECT 
    string_agg(a2.artistalias, ' & ') as col,
    artistname_id 
 FROM artistalias a2
 GROUP BY artistname_id)
AS aggregated_aliases ON aggregated_aliases.artistname_id = artistnames.artistname_id
GROUP BY song;