Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在这个查询中使用leftouterjoin,很困惑,我不确定我的方法是否正确_Sql_Database_Select_Group By_Left Join - Fatal编程技术网

Sql 在这个查询中使用leftouterjoin,很困惑,我不确定我的方法是否正确

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

我想知道所有在底特律工作少于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: 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 );