所以,说我正在做一些事情,比如找到所有员工的名字和姓氏,这些员工都在一个以上的项目上工作。我知道最简单的方法是使用COUNT,就像这样....
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的情况下完成这项工作....我不知道。所以,我想我会在这里询问任何指示或建议,因为我对此很不满意。作为参考,下面快速浏览一下使用过的数据库。非常感谢人们提供的任何帮助或指导。
答案 0 :(得分: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
只能获得works_on中至少有2行的那些,否则双连接失败:)
答案 1 :(得分:1)
只是将类似查询写入Armin和Kenney推荐的另一种方式。
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
方法。