2010-07-29 51 views

回答

125

当表引用数据本身时使用自连接。

例如,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 
+0

这看起来像一个自外连接给我吗? – 2016-12-09 02:47:30

+2

@JoeCaruso这是因为它;) – RedFilter 2016-12-09 18:26:49

+2

我想知道为什么没有人强调“在同一行”部分。这不是完成自我加入的全部要点吗? – 2017-01-02 10:36:10

14

自连接仅仅是当你加入一个表本身。没有关键字SELF JOIN,只需编写一个普通连接,其中参与连接的两个表都是同一个表。有一点需要注意的是,当你自己加入时,有必要为该表使用一个别名,否则表名将是不明确的。

当您想关联来自同一个表的行对时(例如父子关系),这非常有用。以下查询返回类别“Kitchen”的所有直接子类别的名称。

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

很高兴看到此评论。 ON T2.parent = T1。id(因为它会影响结果,如果我们在其中交换'parent'和'id') – himanshupareek66 2017-02-19 16:25:24

+0

不用说'SELF JOIN'关键字。我对这部分感到困惑! – nclsvh 2018-02-12 15:03:50

6

你会在一个“引用”自己的表上使用自联接 - 例如,一个员工表,其中managerid是同一张表上employeeid的外键。

实施例:

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

ON ME.employeeid = E.managerid将创建不同的结果而不是ON ME.managerid = E.employeeid – himanshupareek66 2017-02-19 16:24:06

12

SQL简单地自联接是正常连接,其用于连接一个表到其自身。

例子:

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

为避免结果中出现重复的列名,使用'SELECT t1。*'会不会更安全? – Matthieu 2013-09-28 14:08:12

41

那么,一个典型的例子是,你希望得到员工的名单和他们的直接经理:

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

它基本上是用在有行之间的任何关系存储在同一张表中。

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

等等......

+7

Boo用于非ANSI语法并在ORDER BY子句中使用有序而不是列名。 – RedFilter 2010-07-29 12:06:26

+14

因为错过了答案的重点而回头看你:-)我倾向于使用最简单的语法,因为良好的DBMS'不会影响性能。 – paxdiablo 2010-07-29 12:34:05

+0

迄今为止最好的回答... :) – 2017-05-29 09:45:48

相关问题