繁体   English   中英

自我加入桌子n次

[英]Self joining a table n times

我正在尝试寻找生物学上的“给定生物体的核心基因组”问题。 本质上,给定生物列表,找到它们共有的所有基因。 要抽象化生物学,您可以考虑在一个人列表中找到所有喜欢的颜色(一个人可以有多种喜欢的颜色)。

数据库表如下所示:

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

用户可以指定一组名称,例如[john,jason]以获得[red,blue],或[john]以获得[red,blue,green],或[john,jason,matt]以获得[red]。

我正在尝试通过执行n个自联接来解决此问题,其中n是提供的名称数。

对于提供的任何数量的名称,我有什么办法可以对表进行n次自我连接来解决此问题? 我试图寻找一种通过Postgres函数执行此操作的方法,但无法弄清n个自连接部分...任何帮助或指向正确方向的指针将不胜感激。

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

我认为您不需要自我连接。 您可以使用聚合和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列表和计数即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM