自我加入一张桌子n次

时间:2017-05-28 02:01:00

标签: sql postgresql join self-join sql-function

我试图找到一个生物学的,找到一组给定生物的核心基因组"问题。基本上,给定一个生物列表,找到它们共有的所有基因。为了抽象出生物学,你可以想到找到所有人喜欢的颜色(一个人可以有多种喜欢的颜色)。

数据库表格如下:

name | fav_colour
john | red
john | blue
john | green
jason | red
jason | blue
matt | red
matt | teal

用户可以指定一组名称,如[john,jason],以[红色,蓝色]或[john]获取[红色,蓝色,绿色]或[john,jason,matt]来获取[红色]。

我试图通过执行n次自连接来解决此问题,其中n是提供的名称数。

我有没有办法为表格提供n个自连接来解决这个问题?我试图通过Postgres函数寻找一种方法无法找出n个自连接部分......任何帮助或指向正确方向的指针都将不胜感激。

不,不幸的是,我无法更改架构以更轻松地执行这些类型的查询。

1 个答案:

答案 0 :(得分:3)

我认为你不需要自我加入。您可以使用聚合和HAVING子句:

with t(name, fav_colour) as (
      values ('john', 'red'),
             ('john', 'blue'),
             ('john', 'green'),
             ('jason', 'red'),
             ('jason', 'blue'),
             ('matt', 'red'),
             ('matt', 'teal')
     )
select fav_colour
from t
where name in ('john', 'jason')
group by fav_colour
having count(*) = 2;

价值" 2"是列表中的名称数量。更改IN列表和计数是您需要的唯一更改。