使用外连接和分组来解决查询
Posted
技术标签:
【中文标题】使用外连接和分组来解决查询【英文标题】:Using outer join and group by to solve the query 【发布时间】:2016-02-17 03:00:49 【问题描述】:EMPLOYEE (fmane, 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
我想用outer join和group by来查询下面的信息,可以吗?
获取员工的 SS 和姓氏
1) 担任部门经理
或
2) 担任任何员工的主管
到目前为止我所拥有的是:
Select e.ssn, e.lname, e.fname
From employee e, department d
where d.mgrssn = e.ssn
union(?)
select s.ssn, s.lname, s.fname
From employee e2, employee s
where e.superssn = s.ssn;
1)我认为我的联合是错误的,有什么办法可以改变它,比如使用外连接和分组来获得我需要的东西。
2) 另外,由于我使用了两个员工,一位导师告诉我,我可以使用员工 1 和员工 2 来区分他们,对吗?有没有不使用两个员工的身份证明?
【问题讨论】:
【参考方案1】:SELECT DISTINCT e.ssn, e.lname, e.fname
FROM employee e,
(SELECT mgrssn AS mgrssn
FROM department
UNION
SELECT superssn AS mgrssn
FROM employee) m
WHERE e.ssn = m.mgrssn;
应该可以。
我不确定外部联接或 GROUP BY 在这里如何为您服务;一个从一个表返回在第二个表中有 no 对应行的行,而另一个用于通过聚合函数将多行压缩为一个。
我也不确定是什么
2) 另外,由于我使用了两个员工,一位导师告诉我,我可以使用员工 1 和员工 2 来区分他们,对吗?有没有不使用两个员工的身份证明?
的意思。您可以使用employee1
和employee2
作为employee
的aliases,这将允许您对同一个表进行多个独立引用,但是无论您使用多少别名,仍然只有一个@ 987654325@数据库中的表。
【讨论】:
所以基本上 WHERE e.ssn = m.mgrssn 是联表?因为之前有员工和经理没有联系,所以不能共享信息? 对。这是内连接的“其他”语法。 谢谢! WHERE e.ssn = m.mgrssn 之前的 m 是什么;是错字吗? 这是子查询的表别名,它允许您在 WHERE 子句中将其作为伪表引用。这里实际上可能不需要它,因为mgrssn
明确来自子查询,但它仍然是一个好主意,一些 DBMS 可能会抱怨它的缺失。【参考方案2】:
1)。您的UNION
是正确的!但是你错过了:
From employee e2, employee s
where e.superssn = s.ssn;
改为:
From employee e, employee s -- replace e2 to e
where e.superssn = s.ssn;
2)。是的你可以!对我来说,要区分 2 个 empls,你可以使用 ssn,因为它是独一无二的!
【讨论】:
以上是关于使用外连接和分组来解决查询的主要内容,如果未能解决你的问题,请参考以下文章