我不理解需要自我加入。有人可以请解释他们对我?

一个简单的例子将是非常有益的。

有帮助吗?

解决方案

可以查看自合并为两个相同的表。但是,在规范化,不能创建表的两个副本,所以你只是模拟具有自连接两个表。

假设有两个表:

emp1

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   

emp2

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   

现在,如果你想与他或她老板的名字让每一个员工的名称:

select c1.Name , c2.Name As Boss
from emp1 c1
    inner join emp2 c2 on c1.Boss_id = c2.Id

其中将下表输出:

Name  Boss
ABC   XYZ
DEF   ABC
XYZ   DEF

其他提示

这是相当常见的,当你有一个表,引用本身。例如:雇员表,其中每一个员工都能有一个经理,要列出所有的员工和他们的经理的名字

SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id

一个自连接是与自身的联接的表的

:一种常见的情况是,当表存储实体(记录)在它们之间具有分层关系即可。例如含有表人的信息(姓名,出生日期,地址...)和包括其中包括父(和/或母亲)的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

我们可以得到关于这两个孩子和父亲的信息(和母亲,与第二自连接等,甚至祖父母等)在相同的查询。

让我们说你有一个表 users, 设立这样的:

  • user ID
  • 用户名
  • 用户管理人的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

他们是有用的,如果你的表是自引用。例如,对于页面的表格,每个页面可以有nextprevious链接。这将是在同一个表中的其他页面的ID。如果在某些时候你想获得三个连续的页面,你会做两个自连接与同桌的nextpreviousid列。

设想一个如下所述称为Employee表。所有员工都有一个管理者,这也是雇员(也许除了CEO,其经理标识会为null)

Table (Employee): 

int id,
varchar name,
int manager_id

您可以再使用下面的选择找到所有的员工和他们的经理:

select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id

在不用于向引用自身的表的能力,我们不得不创建层级中的层级的层的数目一样多的表。但是,由于该功能是可用的,你加入表与自身的SQL将其视为两个单独的表,所以一切都是很好的存储在一个地方。

除了上述的答案(这是很好的解释),我想补充,使得使用自加入可以容易地示出一个例子。 假如你有一个具有以下属性的表名为Customers: 客户ID,客户名称,联系人姓名,城市,国家。 现在,你要列出所有那些谁是从“同一个城市”。 你将不得不认为这表的副本,以便我们能够城市的基础上,加入他们的行列。下面的查询将清楚地表明这意味着什么:

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, 
A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City 
ORDER BY A.City;

有许多正确的答案在这里,但有一个变化是同样正确。您可以将您的加入在连接语句而不是WHERE子句条件。

SELECT e1.emp_id AS 'Emp_ID'
  , e1.emp_name AS 'Emp_Name'
  , e2.emp_id AS 'Manager_ID'
  , e2.emp_name AS 'Manager_Name'
FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id

请记住,有时你想e1.manager_id> e2.id

要知道这两种方案的优点是,有时你有一吨的WHERE或JOIN条件,并要放置你的自我加入其他子句中的条件,让您的代码可读性。

没有一个解决当员工没有一个经理会发生什么。咦?它们不包括在结果集中。你不想,如果你想有没有经理的员工什么但不正确的组合回来了?

试试这个小狗;

SELECT e1.emp_id AS 'Emp_ID'
   , e1.emp_name AS 'Emp_Name'
   , e2.emp_id AS 'Manager_ID'
   , e2.emp_name AS 'Manager_Name'
FROM Employee e1 LEFT JOIN Employee e2 
   ON e1.emp_id = e2.emp_id
   AND e1.emp_name = e2.emp_name
   AND e1.every_other_matching_column = e2.every_other_matching_column

一个用例是检查在数据库中重复记录。

SELECT A.Id FROM My_Bookings A, My_Bookings B
WHERE A.Name = B.Name
AND A.Date = B.Date
AND A.Id != B.Id

当你有自己评估表的数据自连接是非常有用的。这意味着它会从同一个表关联的行。

Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName

例如,我们要查找其初始名称等于电流指定员工的姓名。我们可以利用自身在以下方式参与解决这个问题。

SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId

这是数据库等效链表/树,其中行包含在一些容量到另一行的引用。

下面是自我exaplanation在通俗地说加入。自加入不是一个不同类型的联接。如果你已经理解的不同类型的连接(内部,外部和交叉连接),则自加入应该是直线前进。在内部,外部和交叉连接,你加入2个或多个不同的表。然而,自加入你itslef加入同一个表。在这里,我们没有2个不同的表,但使用表的别名对待同一个表不同的表。如果这还不清楚,我会建议看下面的YouTube视频。

自一个示例加入

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top