使用外连接和分组来解决查询

时间:2015-11-16 03:40:32

标签: sql database select group-by outer-join

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

我想使用外连接和分组来查找以下信息,这可能吗?

获取SS和姓氏

员工的姓氏

1)担任部门经理

OR

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)此外,由于我使用了两个empoyees,一位导师告诉我,我可以使用employee1和employee2来区分它们,是吗?反正有没有使用两名员工身份证明?

2 个答案:

答案 0 :(得分:0)

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个人,你可以使用ssn,因为它是独一无二的!

答案 1 :(得分:0)

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)此外,由于我使用了两个empoyees,一位导师告诉我,我可以使用employee1和employee2来区分它们,是吗?反正有没有使用两名员工身份证明?

装置。您可以使用employee1employee2作为employee别名,这样您就可以对同一个表进行多次独立引用,但是您使用了多个别名,数据库中只有一个employee表。