2015-11-01 67 views
0

因此,我正在做类似于查找所有在超过1个项目上工作的员工的名字和姓氏。我知道要做到这一点最简单的方法是使用COUNT,像这样....在MYSQL中查找没有使用计数的记录数

SELECT e.Fname, e.Lname 
FROM employee e INNER JOIN works_on w 
ON e.SSN = w.ESSN 
GROUP BY SSN 
HAVING COUNT(*) > 1 

这让我我需要什么,但有人我帮助问我这是怎么在不使用COUNT来完成...我不知道。所以,我想我会在这里问任何指点或建议,因为我在这方面很干。作为参考,快速查看使用的数据库如下。任何帮助或指导人可以提供将不胜感激。

enter image description here

+2

*“不止一个”*涉及计数,所以我不会使事情复杂化。也就是说,你可以在'work_on'上连接两次,确保两者不同,并查看第二个是否为空。 – Kenney

回答

1

只是一种不同的方式来编写类似的查询到阿明和肯尼的建议。

create table employee(ssn int, fname varchar(50), lname varchar(50)); 
create table works_on (essn int, pno int); 

insert into employee values (1, 'Tom', 'Smith'), (2, 'Matt', 'Smith'), (3, 'Sam', 'Smith'); 
insert into works_on values (1, 1), (2, 1), (2, 2), (3, 1), (3, 2); 

select distinct fname, lname 
from employee e 
inner join works_on w1 on e.ssn = w1.essn 
where exists (
    select 1 from works_on where essn = e.ssn and pno <> w1.pno 
); 

Result: 
| fname | lname | 
|-------|-------| 
| Matt | Smith | 
| Sam | Smith | 

例子:http://sqlfiddle.com/#!9/e2411/5

我喜欢count方法你有,但。

+0

谢谢,这个作品(对我最有意义)。是的,我知道COUNT是做这件事的最好也是最简单的方法,我只是在讨论某个问题时讨厌在墙上打墙。感谢大家。 – enigmahfc

1

正如评论上面已经指出的那样,你可以参加两次,如果你绝对要避免这样的COUNT:

SELECT e.Fname, e.Lname 
FROM employee e 
INNER JOIN works_on w 
    ON e.SSN = w.ESSN 
INNER JOIN works_on wd 
    ON wd.PNO != w.PNO 
GROUP BY SSN 

只会让你那些具有至少2行在work_on中,否则双连接失败:)

相关问题