使用自我加入

时间:2015-12-08 05:12:58

标签: sql oracle self self-join

我有两张桌子(见下文)员工和部门。在employees表下,我有列:

SQL> describe employees



Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPLOYEEID                                NOT NULL NUMBER(9)
 FIRSTNAME                                 NOT NULL VARCHAR2(20)
 LASTNAME                                  NOT NULL VARCHAR2(20)
 CITY                                      NOT NULL VARCHAR2(30)
 STATE                                     NOT NULL CHAR(2)
 DEPTID                                    NOT NULL NUMBER(9)
 MANAGERID                                          NUMBER(9)

由此我需要写一个sql语句,显示每个员工的姓名,姓氏,以及他们的经理的名字和姓氏 - 我试过自己加入无济于事。请帮忙。谢谢!注意:我对此非常陌生。

3 个答案:

答案 0 :(得分:1)

这取决于您是否希望向没有经理的员工展示。这是处理自联接的基本代码:

SELECT
    E1.EMPLOYEEID,
    E1.FIRSTNAME,
    E1.LASTNAME,
    E1.DEPTID,
    E2.EMPLOYEEID   AS 'MANAGER_ID'
    E2.FIRSTNAME    AS 'MANAGER_FIRSTNAME',
    E2.LASTNAME     AS 'MANAGER_LASTNAME'
FROM EMPLOYEE AS E1
    INNER JOIN EMPLOYEE AS E2 ON E1.EMPLOYEEID = E2.MANAGERID
编辑:我原来的回复中有一个拼写错误,所以感谢弗雷德里克抓住了我不小心把#34; EMPLOYEEDID"连接谓词,现在是MANAGERID。不过,该职位的其余部分仍然有效。

如果您想展示那些没有经理的员工,您可以更改内部"加入"左外"加入。

我建议研究自联接和使用它们的一些缺点,并可能将员工 - 经理关系的管理放在不同的表中。还有一个字段似乎没有"标记"一个用户作为管理员或不管理员(我不知道这是否是您的应用程序的要求),这对您也可能有用 - 防止那些不是某些管理人员的用户来自"成为"你桌上的经理。

希望这有帮助!

答案 1 :(得分:0)

您也可以在我应用self joininner join

的地方使用此查询
SELECT emp.FIRSTNAME as EMPF, emp.LASTNAME as EMPL,man.FIRSTNAME as MANF, man.LASTNAME as MANL 
FROM Employees as emp 
INNER JOIN Employees as man on man.EMPLOYEEID = emp.MANAGER_ID

为了获得特定员工的经理。

您可以参考此 tutorial 获取使用此联接的示例和结果。

答案 2 :(得分:0)

自连接是表与自身连接的连接(也称为一元关系), 特别是当表有一个引用自己的PRIMARY KEY的FOREIGN KEY时。 连接表本身意味着表的每一行都与自身以及表的每一行结合。 当表引用数据本身时,我们使用自连接。

自连接的语法为,

SELECT a.column_name, b.column_name... 
FROM table1 a, table1 b 
WHERE a.common_filed = b.common_field;