2011-03-09 51 views
1

使用的Postgres。這裏是我的情況:選擇不同的行從左表

我有三個不同的表。一個是標題表。第二個是流派表。第三張表用於加入這兩個表格。當我設計數據庫時,我預計每個標題都會有一個頂級類型。填充數據後,我發現有一些標題有兩個,有時是三個頂級流派。

我寫的標題檢索及頂層類型的查詢。這顯然要求我加入這兩張桌子。對於那些只有一種頂級流派的人來說,有一條記錄。對於那些有更多的,有多個記錄。

我意識到我可能會寫一些那種會處理這對我的自定義功能,但我認爲我會問是否有可能做到這一點沒有這樣做只是爲了確保我不是丟失了一切。

是否可以編寫一個查詢,讓我選擇的所有不同的標題,不管它有類型的數量,而且還包括流派?或者甚至更好,一個查詢會給我一個逗號分隔的字符串,當有多個?

在此先感謝!

回答

4

聽起來像是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 

我會去數組方法,這樣您就不必擔心爲分隔符保留一個字符,或者在聚合時必須轉義(然後忽略)分隔符。

+0

這很好。謝謝! – csano 2011-03-09 07:09:12