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
)
我不确定我的左连接命令,我做对了吗?
答案 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 );