在此查询中使用左外连接,感到困惑,不确定我是否采用了正确的方法

时间:2015-12-08 21:30:24

标签: sql database select group-by left-join

EMPLOYEE (fname, minit, lname, ssn, birthdate, address, sex, salary, superssn, dno)
KEY: ssn

DEPARTMENT (dname, dnumber, mgrssn, mgrstartdate)
KEY: dnumber.

PROJECT (pname, pnumber, plocation, dnum)
KEY: pnumber.

WORKS_ON (essn, pno, hours)
KEY: (essn, pno)

DEPENDENT (essn, dependent-name, sex, bdate, relationship)
KEY: (essn, dependent-name)

我想找出在底特律工作不到5个项目的所有女性经理的姓氏,名字和ssn。

到目前为止,我有这个:

select lname
from employee e, department d
where (e.ssn = d.mgrssn) 
and  ssn in  (
                       select  w.essn
                       from   works_on w, project p
                       left join w.pno = p.pnumber
                       and  p.plocation = 'Detroit'
                       group by w.essn
                       having count(*) <= 5
                     )

我不确定我的左连接命令,我做对了吗?

2 个答案:

答案 0 :(得分:0)

学习使用显式JOIN语法。简单规则:从不FROM子句中使用逗号。

您的查询将正确写为:

select lname
from employee e join
     department d
     on e.ssn = d.mgrssn and
where e.ssn in  (select  w.essn
                 from works_on w left join
                      project p
                      on w.pno = p.pnumber and  p.plocation = 'Detroit'
                 group by w.essn
                 having count(*) <= 5
                );

注意:这是关于您的查询的语法声明,而不是逻辑及其作用。

答案 1 :(得分:0)

没有看到数据有点困难,我100%同意不使用逗号,我也不确定你为什么要使用左连接,因为你只能得到满足你所设置的条件的结果。就我所知,您无需在此方案中保留空值。你可能需要稍微澄清一下为什么你需要一个左连接,我在这里添加它们只是因为。

SELECT lname,
   fname,
   ssn
FROM Employee
WHERE SEX = 'F'
AND SSN IN( 
          SELECT mgrssn
          FROM department d
               LEFT JOIN works_on w ON d.mgrssn = w.essn
               LEFT JOIN project p ON p.pnumber = w.pno
          WHERE p.plocation = 'Detroit'
          GROUP BY w.essn
          HAVING COUNT(*) < 5 );