自己加入atablen次

Self joining a table n times

我正在尝试寻找生物学 "find core genome of a given set of organisms" 问题。本质上,给定一个生物体列表,找到它们共有的所有基因。为了抽象出生物学,您可以考虑在一组人中找到最喜欢的所有颜色(一个人可以有多种最喜欢的颜色)。

数据库 table 看起来像:

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] 表示获得 [红色].

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

我有什么方法可以对 table 进行 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 列表和计数是您唯一需要的更改。