sql查询中的左外连接

Posted

技术标签:

【中文标题】sql查询中的左外连接【英文标题】:Left Outer Join in sql query 【发布时间】:2016-02-19 11:58:35 【问题描述】:

数据库:

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)

我想使用left outer joingroup by 来... 查找从事 3 个或更多项目且不在克利夫兰的经理的姓氏和 SSN。

这是我目前所拥有的:

select Lname
  from Employee e outer join Department d
where (e.ssn = d.mgrssn) 
   and  ssn NOT in (
                      select  w.essn
                       from   works_on w outer join Project p
                      where w.pno = p.pnumber
                          and  p.plocation = 'Cleveland'
                      group by w.essn
                      having count(*) >= 3
                     )

我使用left outer joingroup by 做对了吗?我应该把这段代码分成两部分,比如循环吗?

【问题讨论】:

outer join 不是 sql 连接类型。有LEFT outer joinRIGHT outer joinFULL outer join。此外,所有这些都需要一个on 子句(或using 子句)。 对不起,我的意思是左外连接,你能写一个答案吗? 我保证我会接受的,真的迷路了 使用左外连接 那么如果项目在克利夫兰,员工就在克利夫兰? 【参考方案1】:

选择JOIN查找该员工的所有项目

首先HAVING告诉你这个用户在'Cleveland'没有项目

第二个HAVING告诉你这个用户有3个或更多的项目

.

SELECT e.Lname, e.ssn
FROM Employee e   
JOIN works_on w
  ON e.ssn = w.essn
JOIN Project p
  ON w.pno = p.pnumber
GROUP BY e.ssn
HAVING 
     SUM(CASE WHEN p.plocation = 'Cleveland' THEN 1 ELSE 0 END) = 0
AND  COUNT(*) >= 3

【讨论】:

以上是关于sql查询中的左外连接的主要内容,如果未能解决你的问题,请参考以下文章

每组右表的左外连接?

将两个查询的左外连接转换为 LINQ

使用 Linq to Sql 的左外连接结果问题

删除重复的左外连接

linq中的左外连接

Criteria Api 中的左外连接