Sql 在这个查询中使用leftouterjoin,很困惑,我不确定我的方法是否正确
我想知道所有在底特律工作少于5个项目的女性经理的姓、名和ssn 到目前为止,我有:Sql 在这个查询中使用leftouterjoin,很困惑,我不确定我的方法是否正确,sql,database,select,group-by,left-join,Sql,Database,Select,Group By,Left Join,我想知道所有在底特律工作少于5个项目的女性经理的姓、名和ssn 到目前为止,我有: 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: pn
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)
我不确定我的左连接命令,我做得对吗?学习使用显式连接语法。简单规则:不要在FROM子句中使用逗号
您的查询将正确地写为:
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
)
注意:这是一个关于您的查询的语法声明,而不是关于逻辑和它的作用。如果不查看数据,这有点困难,我100%同意不使用逗号,我也不确定为什么您要使用左连接,因为您只会得到满足您列出的条件的结果。据我所知,在这种情况下,您不需要保留空值。您可能需要稍微澄清一下为什么需要左连接,我在这里添加它们只是因为
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
);
非常感谢您,如果您想更改为外部连接,我是否要将左连接替换为外部连接?@Stevemccain。没有简单的外部连接。可以使用完全外部联接。左外接与左外接相同。嘿,对不起,我想我提出的问题错了,我想改用外接,你能写一个答案,我会接受吗?左外接是一个外接,左外接与写左外接相同。你的意思是完全连接还是完全外部连接?您想要哪一个取决于您想要实现的目标。如果您想要保留所有相关表中的值,您需要使用完全连接或完全外部连接相同。如果您想要返回特定表,您需要使用右边或左边的值,这取决于它在查询中的结束位置。这里有一个链接,指向一个可能会有所帮助的图表。
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 );