【问题标题】:Using Self Join使用自联接
【发布时间】:2025-11-24 04:40:01
【问题描述】:

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

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 语句,显示每个员工的名字、姓氏以及他们经理的名字和姓氏 - 我尝试了自我加入,但无济于事。请帮忙。谢谢!注意:我对此非常陌生。

【问题讨论】:

    标签: sql oracle self self-join


    【解决方案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
    

    编辑:我在原始回复中有错字,因此感谢 Frederick 发现我不小心将“EMPLOYEEDID”作为连接谓词,现在是 MANAGERID。不过,帖子的其余部分仍然有效。

    如果您还想显示没有经理的员工,您可以将“内部”联接更改为“左外部”联接。

    我建议研究自联接以及使用它们的一些缺点,并可能将员工-经理关系的管理放到不同的表中。似乎也没有一个字段将用户“标记”为经理或不是(我不知道这是否是您的应用程序的要求),这也可能对您有用 -以防止不是某种或其他类型管理员的用户“成为”您表中的管理员。

    希望这会有所帮助!

    【讨论】:

    • 我认为您的意思是使用INNER JOIN EMPLOYEE AS E2 ON E1.MANAGERID = E2.EMPLOYEEID 显示他们经理的详细信息
    • 是的,完全是为了打字。接得好。当这就是我最初的意思时,感觉就像一个彻头彻尾的傻瓜..
    【解决方案2】:

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

    自连接的语法为,

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

    【讨论】:

      【解决方案3】:

      您也可以在我应用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 以获取使用此连接的示例和后果。

      【讨论】: