給定一個表名稱:
name_id|naam|
------- ----
1|Ad |
2|Bo |
3|Che |
和一個表格小部件,其中每個小部件都有一個名稱 id 的陣列:
widget_id|name_ids|
--------- --------
1|{1,2,3} |
2|{3,2} |
我需要創建一個 SELECT 查詢以將帶有 name_ids 的陣列替換為這樣的名稱陣列:
widget_id|names |
--------- -----------
1|{Ad,Bo,Che}|
2|{Che,Bo} |
在這篇 SO 帖子中,我發現了如何將名稱連接到名稱 ID,但這會導致每個名稱都有一個新的小部件行:
select * from
(select widget_id , unnest (name_ids) name_id from widgets w ) ww
inner join names n on ww.name_id = n.name_id
widget_id|name_id|name_id|naam|
--------- ------- ------- ----
1| 1| 1|Ad |
1| 2| 2|Bo |
1| 3| 3|Che |
2| 3| 3|Che |
2| 2| 2|Bo |
缺少并且找不到的是某種 GROUP BY WIDGET_ID 和 UNNEST 的逆函式,以便將小部件的所有名稱放入名稱陣列中,但似乎沒有函式 NEST。我在 Oracle 方面經驗豐富,但 PostgreSQL 似乎更高級、更復雜。
任何幫助表示贊賞。
uj5u.com熱心網友回復:
您需要在動態“標準化”之后按 widget_id 進行widgets分組
select w.widget_id, w.name_ids, array_agg(n.naam) names
from widgets w
cross join unnest(name_ids) as u(name_id)
join names n on n.name_id = u.name_id
group by w.widget_id, w.name_ids
order by w.widget_id;
輸出:
widget_id|name_ids|names |
--------- -------- -----------
1|{1,2,3} |{Ad,Bo,Che}|
2|{3,2} |{Che,Bo} |
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510799.html
