什么是自连接,何时使用?

144

什么是自连接,何时使用它?我不理解自连接,能给出一个通俗易懂的例子来说明吗?

5个回答

203

当一个表中的数据引用了表本身时,可以使用自连接。

例如,一个Employee表可能具有SupervisorID列,该列指向当前雇员的上司。

为了查询数据并在一行中获取两个人的信息,可以使用如下的自连接:

select e1.EmployeeID, 
    e1.FirstName, 
    e1.LastName,
    e1.SupervisorID, 
    e2.FirstName as SupervisorFirstName, 
    e2.LastName as SupervisorLastName
from Employee e1
left outer join Employee e2 on e1.SupervisorID = e2.EmployeeID

1
这看起来像是一个自然外连接,对吗? - Joe Caruso
7
@JoeCaruso 那是因为它就是那样的 ;) - D'Arcy Rittich
7
为什么没有人强调“在同一行”的部分呢?这不是执行自连接的全部意义吗? - A. Sallai
1
创建表别名时,我们不需要使用AS吗? - Manu Chadha
3
@ManuChadha 表示 AS 是可选的,我将根据查询语句的可读性来决定是否使用。 - D'Arcy Rittich
@JoeCaruso LEFT JOIN和LEFT OUTER JOIN是同一件事。 - mjeshtri

84

嗯,一个经典的例子是当你想要获取员工及其直接经理的列表时:

select e.employee as employee, b.employee as boss
from emptable e, emptable b
where e.manager_id = b.empolyee_id
order by 1

通常情况下,它被用于存储在同一表中的行之间存在任何关系的情况。

  • 员工。
  • 多层次营销。
  • 机器零件。

等等...


26

自连接是指将一个表与自身进行连接。没有SELF JOIN关键字,您只需编写一个普通的连接,在其中参与连接的两个表都是相同的表。需要注意的一点是,当您进行自连接时,必须为表使用别名,否则表名将会有歧义。

在需要关联来自同一张表的行对时非常有用,例如父子关系。以下查询返回类别“厨房”的所有直接子类别的名称。

SELECT T2.name
FROM category T1
JOIN category T2
ON T2.parent = T1.id
WHERE T1.name = 'Kitchen'

很高兴看到这个评论... ON T2.parent = T1.id (因为如果我们在其中交换 'parent' 和 'id',它会影响结果) - himanshupareek66
5
很好提到没有“SELF JOIN”关键字。我对那部分感到困惑! - nclsvh

11

SQL自连接简单来说就是将表与其本身进行连接的普通连接。

示例:

Select *
FROM Table t1, Table t2
WHERE t1.Id = t2.ID

21
为了避免结果中出现重复的列名,使用“SELECT t1.*”是否更安全? - Matthieu

6

如果一个表“引用”自身,比如员工表中的managerid是同一表中employeeid的外键,你可以使用自连接。

例如:

SELECT E.name, ME.name AS manager
FROM dbo.Employees E
LEFT JOIN dbo.Employees ME
ON ME.employeeid = E.managerid

在 ON ME.employeeid = E.managerid 中使用将产生不同的结果,而不是 ON ME.managerid = E.employeeid。 - himanshupareek66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接