当行匹配其他表中的多行时,连接表

时间:2015-08-28 12:10:42

标签: sql postgresql

我想加入3个表(如下所示),但我无法弄清楚如何做到这一点:

表1

vendor_id
---------
1
2
3
4

表2

cuisine_type | vendor_id
------------------------
a            |1
b            |1
c            |1

表3

cuisine_type|cuisine
--------------------
a           |pizza
b           |rice
c           |steak

我想加入3个表格并获得:

vendor_id|cuisine_type|cuisine
------------------------------
1        |a, b, c     |pizza, steak, rice
2.......

我希望这是有道理的。我对postgreSQL很新,所以也许我错过了一些非常简单/明显的东西。

2 个答案:

答案 0 :(得分:2)

这是一个简单的连接和基于vendor_id的聚合:

select v.vendor_id, 
       string_agg(ct.cuisine_type, ', ') as cuisine_type,
       string_agg(c.cuisine, ', ') as cuisine
from table_1 as v
   join table_2 as ct on v.vendor_id = ct.vendor_id
   join table_3 as c on ct.cuisine_type = c.cuisine_type
group by v.vendor_id;

答案 1 :(得分:1)

你的表结构看起来有点奇怪。例如,为什么每种菜肴都只有一种美食?通常情况下,我希望供应商与菜肴相关联,然后每种菜肴都有一种类型。

但是,这不是问题。根据您提供的数据,您可以使用string_agg()

select v.vendor_id, string_agg(cuisine_type, ', ') as cuisine_types,
       string_agg(cuisine, ', ') as cuisines
from table1 v left join
     table2 v2c
     on v.vendor_id = v2c.vendor_id left join
     table3 c
     on c.cuisine_type = v2c.cuisine_type
group by v.vendor_id;