在此查询中使用左外连接,感到困惑,不确定我的做法是否正确
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 );
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 );