簡體   English   中英

根據左表中的值選擇不同的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM