MYSQL IN替代

时间:2011-04-25 14:52:49

标签: mysql

美好的一天

我正在尝试查询处理每个项目的员工的姓名。 我的代码如下:

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 

IN的问题在于,里面的值就像被评估为'OR'... IN的等价物使得我的子查询的值被评估为'AND'

提前谢谢。

编辑: 如需要......

enter image description here

3 个答案:

答案 0 :(得分: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
        )

答案 1 :(得分: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);

答案 2 :(得分: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)
)

嗯..但我认为这可能是最简单的,授予员工的work_on没有重复的pno,即在project_on中没有pno,项目中不存在,即保持参照完整性

SELECT * FROM employee 
WHERE ssn IN
(
    SELECT essn
    FROM works_on
    GROUP BY essn
    HAVING COUNT(pno) = (SELECT COUNT(*) FROM project)
)