[英]Selecting distinct rows based on values from left table
使用Postgres。 這是我的情景:
我有三張不同的桌子。 一個是標題表。 第二個是流派表。 第三個表用於連接兩個。 當我設計數據庫時,我希望每個標題都有一個頂級類型。 在填充數據之后,我發現有些標題有兩種,有時是三種頂級類型。
我寫了一個檢索標題及其頂級類型的查詢。 這顯然要求我加入這兩個表。 對於那些只有一個頂級類型的人,有一個記錄。 對於那些有更多的記錄,有多個記錄。
我意識到我可能不得不寫一個能為我處理這個問題的自定義函數,但我想我會問這樣做是否可以不這樣做,只是為了確保我沒有遺漏任何東西。
是否有可能編寫一個查詢,允許我選擇所有不同的標題,無論它有多少類型,但也包括類型? 或者甚至更好,一個查詢,當有多個時,會給我一個逗號分隔的流派字符串?
提前致謝!
對我來說聽起來像是array_agg
的工作。 使用這樣的表格:
create table t (id int not null, title varchar not null);
create table g (id int not null, name varchar not null);
create table tg (t int not null, g int not null);
你可以這樣做:
SELECT t.title, array_agg(g.name)
FROM t, tg, g
WHERE t.id = tg.t
AND tg.g = g.id
GROUP BY t.title, t.id
要得到:
title | array_agg
-------+-----------------------
one | {g-one,g-two,g-three}
three | {g-three}
two | {g-two}
然后根據需要解壓縮數組。 如果由於某種原因你真的想要一個以逗號分隔的字符串而不是數組,那么string_agg
就是你的朋友:
SELECT t.title, string_agg(g.name, ',')
FROM t, tg, g
WHERE t.id = tg.t
AND tg.g = g.id
GROUP BY t.title, t.id
你會得到這樣的東西:
title | string_agg
-------+---------------------
one | g-one,g-two,g-three
three | g-three
two | g-two
我會使用數組方法,這樣你就不必擔心為分隔符保留一個字符,或者在聚合時必須轉義(然后是unescape)分隔符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.