2015-09-06 45 views
0

這個問題是我前一個問題的繼續,可以找到here如何使用數據引用的* _id字段來分隔/格式化string_agg()聚合數據?

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) 
); 
  • 一個藝術家(表artistnames)可以有零個,一個或多個別名
  • 一個別名(表artistalias)屬於一個藝術家
  • 一個歌曲(表歌曲)有一個或多個藝術家(並且指的是他用來執行歌曲的藝術家的別名)

示例: 藝術家Francis Veigar也使用別名Francis FatFrancis Fighter。一首歌歌1已經發布了藝術家的名字弗朗西斯Veigar,爲另一首歌曲宋2他用化名弗朗西斯脂肪和第三首歌曲歌曲3他使用別名弗朗西斯戰鬥機唱,連同另一位藝術家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 | 
+----------------------------+-----------------------------+--------------------------------------------------------------------+--------+ 

分離pseudonymes /別名兩種不同的藝術家正在使用'/'。在查詢中需要改變什麼才能實現這個目標?

回答

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; 
相關問題