根据左表中的值选择不同的行

时间:2011-03-09 03:51:14

标签: sql postgresql

使用Postgres。这是我的情景:

我有三张不同的牌桌。一个是标题表。第二个是流派表。第三个表用于连接两个。当我设计数据库时,我希望每个标题都有一个顶级类型。在填充数据之后,我发现有些标题有两种,有时是三种顶级类型。

我写了一个检索标题及其顶级类型的查询。这显然要求我加入这两个表。对于那些只有一个顶级类型的人,有一个记录。对于那些有更多的记录,有多个记录。

我意识到我可能不得不编写一种可以为我处理此问题的自定义功能,但我想我会问这样做是否可以不这样做只是为了确保我不会错过任何东西。

是否有可能编写一个查询,允许我选择所有不同的标题,无论它有多少类型,但也包括类型?或者更好的是,当有多个时,会给我一个以逗号分隔的流派字符串的查询?

提前致谢!

2 个答案:

答案 0 :(得分: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

我会使用数组方法,这样你就不必担心为分隔符保留一个字符,或者在聚合时不得不转义(然后用unescape)分隔符。

答案 1 :(得分:0)

请查看可能会回答您问题的this thread