简化的例子:
create table emp_work_on
(
emp_name varchar(50),
work_on varchar(30)
);
create table works
(
work_on varchar(30)
);
insert into works(work_on) values('apple'),('microsoft'),('google'),('facebook')
insert into emp_work_on values
('john','apple'),('john','microsoft'),('john','google'),('john','facebook'),
('paul','microsoft'),('paul','google'),
('george','apple'),('george','microsoft'),('george','google'),('george','facebook'),
('ringo','apple'),('ringo','facebook');
select e.emp_name
from works w
left join emp_work_on e on e.work_on = w.work_on
group by e.emp_name
having count(e.work_on) = (select count(*) from works)
order by e.emp_name
输出:
emp_name
----------
george
john
(2 rows)
在你的表结构,你可以这样做:
SELECT * FROM employee
WHERE ssn IN
(
SELECT w.essn
FROM project c
LEFT JOIN works_on w ON w.pno = c.pnumber
GROUP BY w.essn
HAVING COUNT(w.pno) = (SELECT COUNT(*) FROM project)
)
嗯..但我认为这可能是最简单的,给予有对员工的works_on没有重复PNO,即有一个在works_on那并不是没有PNO t存在于项目中,即保持参照完整性
SELECT * FROM employee
WHERE ssn IN
(
SELECT essn
FROM works_on
GROUP BY essn
HAVING COUNT(pno) = (SELECT COUNT(*) FROM project)
)
我不明白。一列如何同时具有多个值? – 2011-04-25 14:53:31
@Pekka有什么建议吗? – newbie 2011-04-25 14:57:01
@Pekka的含义是什么,'IN('b','c')'等于WHERE a ='b'还是a ='c''。你想要的是'WHERE a ='b'AND a''c'',但是'a'既可以同时是'b'又可以'c''又怎么样? – Halcyon 2011-04-25 14:57:24