自连接的说明

l--*_*''' 78 sql self-join

我不明白自我加入的必要性.有人可以向我解释一下吗?

一个简单的例子非常有用.

poi*_*ics 87

您可以将自联接视为两个相同的表.但在规范化中,您无法创建表的两个副本,因此您只需模拟两个具有自连接的表.

假设你有两个表:

emp1

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   
Run Code Online (Sandbox Code Playgroud)

emp2

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   
Run Code Online (Sandbox Code Playgroud)

现在,如果你想用他或她老板的名字得到每个员工的名字:

select c1.Name , c2.Name As Boss
from emp1 c1
    inner join emp2 c2 on c1.Boss_id = c2.Id
Run Code Online (Sandbox Code Playgroud)

这将输出下表:

Name  Boss
ABC   XYZ
DEF   ABC
XYZ   DEF
Run Code Online (Sandbox Code Playgroud)

  • 呃,你创造了一个老板悖论:) (39认同)
  • `left join` 我认为最好不要把没有老板的员工(或老板)排除在外;顶级狗! (3认同)

win*_*nas 19

当你有一个引用自己的表时,这很常见.示例:员工表,其中每个员工都可以拥有经理,并且您希望列出所有员工及其经理的姓名.

SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
Run Code Online (Sandbox Code Playgroud)


mjv*_*mjv 18

自联接是表与自身的连接.

一个常见的用例是表存储在它们之间具有层次关系的实体(记录).例如,包含人员信息(姓名,DOB,地址......)并且包括其中包括父亲(和/或母亲)的ID的列的表格.然后用一个小的查询就好了

SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN  myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago'  -- Or some other condition or none
Run Code Online (Sandbox Code Playgroud)

我们可以在同一查询中获得有关孩子和父亲(以及母亲,第二次自我加入等,甚至是父母等等)的信息.


cee*_*yoz 5

假设你有一张桌子users,设置如下:

  • 用户身份
  • 用户名
  • 用户经理的ID

在这种情况下,如果您想在一个查询中提取用户的信息经理的信息,您可能会这样做:

SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
Run Code Online (Sandbox Code Playgroud)


Kla*_*sen 5

想象一个Employee如下所述的表。所有员工都有一个也是员工的经理(也许除了 CEO,他的 manager_id 将为空)

Table (Employee): 

int id,
varchar name,
int manager_id
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下选择来查找所有员工及其经理:

select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
Run Code Online (Sandbox Code Playgroud)