首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgreSQL递归-在其他公司中查找包含多个员工和不同工作的所有周期

postgreSQL递归-在其他公司中查找包含多个员工和不同工作的所有周期
EN

Stack Overflow用户
提问于 2019-02-21 15:40:44
回答 1查看 199关注 0票数 0

具体来说,我应该使用递归psql来解决问题。我们有:

  • A人是X公司的首席执行官和Y公司的主席。
  • B人是Y公司的首席执行官和Z公司的董事。
  • C人是Z公司的首席执行官和X公司的副主席。

使用递归SQL,查找包含3、4或5名员工的所有周期,其中每个员工在一个公司担任首席执行官,在下一个周期中担任董事、副主席或董事长。

代码语言:javascript
复制
-- This is the table in mind:
CREATE TABLE info (
company text
job text
employee text
primary key (company, job, employee)
);

-- Desired result
Cycle     Employee     Job        Company
-------------------------------------------
1         Jonathan     CEO        DillCO
1         Joseph       CEO        Joestar
2         Jonathan     Chairman   Joestar
2         Joseph       Director   DillCO

我并不擅长SQL,但我正在学习。您可以以他们想要的方式来解释这个问题,而且它不需要完全像我想要的输出(因为它是我对它的解释)。

下面是一些可以插入到表中的示例数据:

代码语言:javascript
复制
insert into info values('Bolk', 'CEO', 'Stein Hald');
insert into info values('Forsk', 'Chairman', 'Stein Hald')
insert into info values('Bolk', 'Chairman', 'Guro Dale');
insert into info values('Bolk', 'Director', 'Rolf Numme');
insert into info values('Bonn', 'CEO', 'Hauk Storm');
insert into info values('Bonn', 'Chairman', 'Live Brog');
insert into info values('Bonn', 'Director', 'Tor Fjeld');
insert into info values('Braga', 'CEO', 'Truls Lyche');
insert into info values('Hiro', 'Deputy chairman', 'Rolf Numme');
insert into info values('Hafn', 'Chairman', 'Hauk Storm');

以下是我所拥有的:

代码语言:javascript
复制
-- so far, finds all CEOs recursively in the first cycle
WITH RECURSIVE cycle (emp, job, comp, cyclenr) AS (
SELECT si.employee, si.job, si.company, 1
FROM info si 
UNION ALL
SELECT c.emp, c.job, c.comp, c.cyclenr+1
FROM cycle c
JOIN info c2 on c.emp = c2.employee
WHERE cyclenr < 1
)
SELECT * FROM cycle
WHERE job = 'CEO';

这只会在第一个周期中找到所有的CEO,但我在其他方面遇到了麻烦。

EN

回答 1

Stack Overflow用户

发布于 2019-02-21 19:56:43

这里有个主意。过滤到只有首席执行官。然后生成它们的所有组合并检查循环。

对于一个周期为3的周期,如下所示:

代码语言:javascript
复制
with ec as (
      select distinct employee, company
      from info
      where job = 'CEO'
     )
select *
from ec ec1 join
     ec ec2
     on ec1.employee <> ec2.employee  join
     ec ec3
     on ec3.employee not in (ec1.employee, ec2.employee)
where exists (select 1
              from info i
              where i.employee = ec2.employee and i.company = ec1.company and i.job in ('Chairman', 'Director')
             ) and

       exists (select 1
              from info i
              where i.employee = ec3.employee and i.company = ec2.company and i.job in ('Chairman', 'Director')
             ) and
      exists (select 1
              from info i
              where i.employee = ec1.employee and i.company = ec3.company and i.job in ('Chairman', 'Director')
             ) ;

这里就是一个例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54810899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档