Sql 寻找申请2份以上工作的申请人

Sql 寻找申请2份以上工作的申请人,sql,oracle,Sql,Oracle,我正试图找到申请过2家以上不同公司的申请人 申请人应为: 莫妮卡(a2):工作101、j02和j04 吉姆(a3):工作j02、j04和j06 这是用于此的脚本 drop table Jobskills; drop table Appskills; drop table Applies; drop table Applicant; drop table Skills; drop table Job; drop table Company; create table Company(compid

我正试图找到申请过2家以上不同公司的申请人

申请人应为:

莫妮卡(a2):工作101、j02和j04

吉姆(a3):工作j02、j04和j06

这是用于此的脚本

drop table Jobskills;
drop table Appskills;
drop table Applies;
drop table Applicant;
drop table Skills;
drop table Job;
drop table Company;

create table Company(compid char(5) primary key, compname varchar(20), 
                     comptype varchar(15));
create table Job(jobid char(5) primary key, jobtitle varchar(20),
                 salarylow int, salaryhigh int, location char(10), 
                 compid references Company(compid) on delete cascade);
create table Skills(skillid char(5) primary key, skillname varchar(15));
create table Jobskills(jobid references Job(jobid) on delete cascade, 
                       skillid references Skills(skillid), 
               expertiseneeded int, primary key(jobid,skillid));
create table Applicant(appid char(5) primary key, name varchar(15), 
                       age int, highdegree char(5), expected_salary int) ;
create table AppSkills(appid references Applicant(appid) on delete cascade, 
                       skillid references Skills(skillid), expertise int,
                       primary key(appid, skillid));
create table Applies(jobid references Job(jobid), 
                     appid references Applicant(appid) on delete cascade, 
                     appdate date, decisiondate date, outcome char(10),  
                     primary key(jobid, appid));

rem Initial Company data
insert into Company values('PWC', 'Price Waterhouse', 'consulting');
insert into Company values('MSFT', 'Microsoft', 'software');
insert into Company values('INTL', 'Intel', 'electronics');
insert into Company values('NCR', 'NCR Corp', 'server');
insert into Company values('WPAF', 'WP Air Force', 'defense');
insert into Company values('DLT', 'Deloitte', 'consulting');

rem Initial Job data
insert into Job values('101', 'Programmer', 55000, 60000, 'Redmond', 'MSFT');
insert into Job values('j02', 'Designer', 42000, 45000, 'Redmond', 'MSFT');
insert into Job values('j03', 'SAP impl', 30000, 40000, 'Chicago', 'PWC');
insert into Job values('j04', 'Proj mgmt', 35000, 55000, 'Chicago', 'PWC');
insert into Job values('j05', 'SOX', 60000, 65000, 'Detroit', 'PWC');
insert into Job values('j06', 'db admin', 45000, 50000, 'Dayton', 'NCR');
insert into Job values('j07', 'db designer', 35000, 40000, 'Dayton', 'NCR');
insert into Job values('j08', 'intern', 25000, 28000, 'Dayton', 'NCR');
insert into Job values('j09', 'engineer', 52000, 55000, 'Dayton','WPAF');
insert into Job values('j10', 'dba', 62000, 65000, 'Dayton','WPAF');
insert into Job values('j11', 'hardware dev', 50000, 65000, 'NYC','INTL');
insert into Job values('j12', 'pcb designer', 55000, 68000,'NYC','INTL');
insert into Job values('j13', 'chip designer', 40000, 55000,'Chicago','INTL');
insert into Job values('j14', 'IT', 40000, 60000, 'Dayton', 'DLT');
insert into Job values('j15', 'IT', 50000, 70000, 'Chicago', 'DLT');

rem initial Skills data
insert into Skills values('s1', 'database');
insert into Skills values('s2', 'programming');
insert into Skills values('s3', 'sox');
insert into Skills values('s4', 'project');
insert into Skills values('s5', 'hardware');
insert into Skills values('s6', 'sap');
insert into Skills values('s7', 'analysis');

rem Initial Jobskills data
insert into Jobskills values('101', 's2', 5);
insert into Jobskills values('101', 's7', 4);
insert into Jobskills values('j02', 's2', 3);
insert into Jobskills values('j02', 's7', 5);
insert into Jobskills values('j03', 's6', 5);
insert into Jobskills values('j04', 's7', 4);
insert into Jobskills values('j04', 's4', 5);
insert into Jobskills values('j04', 's2', 2);
insert into Jobskills values('j05', 's3', 5);
insert into Jobskills values('j06', 's1', 5);
insert into Jobskills values('j06', 's2', 3);
insert into Jobskills values('j07', 's1', 4);
insert into Jobskills values('j07', 's7', 3);
insert into Jobskills values('j08', 's1', 2);
insert into Jobskills values('j09', 's2', 4);
insert into Jobskills values('j09', 's4', 4);
insert into Jobskills values('j10', 's4', 3);
insert into Jobskills values('j10', 's1', 5);
insert into Jobskills values('j11', 's5', 3);
insert into Jobskills values('j11', 's4', 3);
insert into Jobskills values('j12', 's5', 5);
insert into Jobskills values('j13', 's1', 4);
insert into Jobskills values('j13', 's2', 5);
insert into Jobskills values('j14', 's7', 4);

rem initial Applicants data
insert into Applicant values('a1', 'Joe', 30, 'MS', 55000);
insert into Applicant values('a2', 'Monica', 25, 'BS', 62000);
insert into Applicant values('a3', 'Jim', 22, 'BS', 45000);
insert into Applicant values('a4', 'Monica', 25, 'BS', 34000);

rem initial Appskills data
insert into Appskills values('a1', 's1', 3);
insert into Appskills values('a1', 's2', 4);
insert into Appskills values('a1', 's4', 4);
insert into Appskills values('a1', 's6', 3);
insert into Appskills values('a1', 's7', 4);
insert into Appskills values('a2', 's2', 3);
insert into Appskills values('a2', 's3', 5);
insert into Appskills values('a2', 's6', 4);
insert into Appskills values('a3', 's4', 3);
insert into Appskills values('a3', 's1', 3);
insert into Appskills values('a3', 's2', 5);

rem Applies
insert into Applies values ('101', 'a1', '01-JAN-06', '08-JAN-06', 'hire');
insert into Applies values ('101', 'a2', '01-JAN-06', '08-JAN-06', 'hire');
insert into Applies values ('j02', 'a2', '01-JAN-06', '08-JAN-06', 'hire');
insert into Applies values ('j04', 'a2', '01-JAN-06', '08-JAN-06', 'hire');
insert into Applies values ('j02', 'a3', '01-JAN-06', '08-JAN-06', 'nohire');
insert into Applies values ('j04', 'a3', '01-JAN-06', '08-JAN-06', 'nohire');
insert into Applies values ('j06', 'a3', '01-JAN-06', '08-JAN-06', 'nohire');
这是我到目前为止的代码


但有些事情不对劲,因为我得到了乔(a1),而我不应该得到他。我应该只找Monica(a2)和Jim(a3)。我错过了什么?

嗯。你需要聚合。要回答你的问题,你只需要一个
拥有
条款,工作和公司并不重要。但如果愿意,可以将它们放入分隔字符串中:

SELECT app.name, app.appid,
       LIST_AGG(j.jobid, ',') WITHIN GROUP (ORDER BY j.jobid), 
       LIST_AGG(c.compname, ',') WITHIN GROUP (ORDER BY c.compname)
FROM applicant app INNER JOIN
     applies apps
     ON app.appid = apps.appid INNER JOIN 
     job j
     ON j.jobid = apps.jobid INNER JOIN
     company c
     ON c.compid = j.compid
GROUP BY app.name, app.id, 
HAVING COUNT(DISTINCT c.compname) > 2;

在通用表格表达式中,我对申请人的唯一大学名称进行了排名。然后,在exists中,我只统计了不止一所大学的申请者,并仅显示了这些申请者的信息

with cte as (
SELECT app.name, app.appid, j.jobid, c.compname, dense_rank()over(partition by app.appid order by compname)companycount
FROM applicant app INNER JOIN applies apps ON app.appid = apps.appid INNER JOIN 
job j ON j.jobid = apps.jobid INNER JOIN company c ON c.compid = j.compid)
select name,appid,jobid,compname from cte c
where exists (select appid from cte ct where ct.companycount>1 and c.appid=ct.appid)

区分谁被选中和谁未被选中的业务逻辑是什么。@EdStevens区别在于申请人a3没有被录用,但申请人a2和a3总共申请了3份工作,所以他们应该出现?不,您需要解释业务规则以确定您选择的人。报告的商业目的。最接近你的是“找到申请了2家以上不同公司的申请人”。申请人有2份或以上申请,但申请的是同一家公司,该怎么办?你想只报告那些最终被录用的人,还是那些符合“申请数量”要求的人?如果只有那些最终被聘用的人,他们的被聘用与任何特定的申请之间是否有任何联系?即:申请3次,聘用一次,而不是申请3次,全部聘用三人?@EdStevens他们是否被聘用并不重要,而是申请人提交了两个以上不同的公司。所以,我希望找到符合不同公司申请人数的人。好的。@Gordon Linoff回答了吗?我只是想让您澄清需求,以便那些在复杂sql方面比我优秀的人能够更好地理解这个问题。
with cte as (
SELECT app.name, app.appid, j.jobid, c.compname, dense_rank()over(partition by app.appid order by compname)companycount
FROM applicant app INNER JOIN applies apps ON app.appid = apps.appid INNER JOIN 
job j ON j.jobid = apps.jobid INNER JOIN company c ON c.compid = j.compid)
select name,appid,jobid,compname from cte c
where exists (select appid from cte ct where ct.companycount>1 and c.appid=ct.appid)