自己加入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
列表和计数是您唯一需要的更改。
我正在尝试寻找生物学 "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
列表和计数是您唯一需要的更改。