2011-04-25 38 views
2

美好的一天MYSQL IN

我想查询在每个项目上工作的员工的姓名。 我的代码如下:

SELECT CONCAT (fname,' ', minit,'. ' , lname) AS NAME 
FROM employee a, works_on b, project c 
WHERE pno IN (Select pnumber  //WHAT COULD I SUBSTITUTE W/ IN 
       FROM projet) 
    AND a.ssn = b.essn 
    AND b.pno = c.pnumber 

在的问题是,它是价值观里面都像评价为“OR” ......是什么的,使我的子查询的评估值相当于like'AND'

谢谢您提前。

编辑: 作为reqeusted ..

enter image description here

+0

我不明白。一列如何同时具有多个值? – 2011-04-25 14:53:31

+0

@Pekka有什么建议吗? – newbie 2011-04-25 14:57:01

+0

@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

回答

4
SELECT * 
FROM employee e 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM employee ei 
     CROSS JOIN 
       project p 
     LEFT JOIN 
       works_on wo 
     ON  wo.pno = p.pnumber 
       AND wo.essn = ei.ssn 
     WHERE ei.ssn = e.ssn 
     ) 
+0

我向你的SQL掌握鞠躬。太好了! – 2011-04-25 15:00:28

2
select CONCAT (fname,' ', minit,'. ' , lname) AS NAME 
from employee 
left join works_on 
on works_on.essn=employee.ssn 
group by employee.ssn 
having count(works_on.essn) = (select count(*) from project); 
1

简化的例子:

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) 
)