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

Using left outer join in this query, confused, not sure I did the right way

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
                     )

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

学习使用明确的 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
                );

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

没有看到数据有点困难,我 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 );