繁体   English   中英

了解自我加入

[英]Understanding Self Join

我正在练习自我加入 ,这是我在编写查询时不理解的事情。

我有一张桌子'employee'

employee表包含三条记录。

+-----+---------------+------------+
| id  | employee      | manager_id |
+-----+---------------+------------+
| 1   | Ola           |   NULL     |
| 2   | Ahmed         |    1       |
| 3   | Tove          |    1       |
+----------+----------+------------+

最后一列manager_id指的是第一列id,他是Ahmed和Tove的Ola经理。

如果我写的查询像

SELECT emp.employee as NAME, manager.employee as MANAGER
FROM employee as emp, employee as manager
WHERE emp.id = manager.manager_id

结果使艾哈迈德和托夫经理。

SELECT emp.employee as NAME, manager.employee as MANAGER
FROM employee as emp, employee as manager
WHERE manager.id = emp.manager_id

使它正确,有人可以解释一下吗?

自联接就像一个内部联接,其中同一个表的两个或多个实例通过公共数据类型列/字段连接在一起。 这种连接(内连接)根据连接条件给出公共行。

employee表包含三条记录。 在这种情况下,

员工为emp:

+-----+---------------+------------+
| id  | employee      | manager_id |
+-----+---------------+------------+
| 1   | Ola           |   NULL     |
| 2   | Ahmed         |    1       |
| 3   | Tove          |    1       |
+----------+----------+------------+

员工担任经理:

+-----+---------------+------------+
| id  | employee      | manager_id |
+-----+---------------+------------+
| 1   | Ola           |   NULL     |
| 2   | Ahmed         |    1       |
| 3   | Tove          |    1       |
+----------+----------+------------+

现在第一个案例:让我们尝试这个来理解差异:

SELECT emp.*manager.* FROM employee as emp,employee as manager Manager WHERE emp.id = manager.manager_id

+-----+---------------+------------+-----+---------------+------------+
| id  | employee      | manager_id | id  | employee      | manager_id |
+-----+---------------+------------+-----+---------------+------------+
| 1   | Ola           |   NULL     | 2   | Ahmed         |    1       |
| 1   | Ola           |   NULL     | 3   | Tove          |    1       |
+----------+----------+------------+----------+----------+------------+

请参阅emp.id = manager.manager_id。 因此,作为NAME的emp.employee从第一个表和manager.employee给出Ola行,因为MANAGER从第二个表中给出了Ahmed&Tove行。

现在第二个案例:让我们试试这个来理解它们的区别:

SELECT emp.*manager.* FROM employee as emp,employee as manager Manager WHERE manager.id = emp.manager_id

+-----+---------------+------------+-----+---------------+------------+
| id  | employee      | manager_id | id  | employee      | manager_id |
+-----+---------------+------------+-----+---------------+------------+
| 2   | Ahmed         |    1       | 1   | Ola           |   NULL     |  
| 3   | Tove          |    1       | 1   | Ola           |   NULL     |
+----------+----------+------------+----------+----------+------------+

请参阅manager.id = emp.manager_id。 因此,作为NAME的emp.employee从第一个表和manager.employee给出Ahmed&Tove行,因为MANAGER从第二个表中给出了Ola行。

编写WHERE emp.id = manager.manager_id没有多大意义,因为经理(或者你想要显示为经理的行)没有manager_id。 即你必须从emp.manager_id开始,因为你想要列出员工以及你要列出相应经理的那个员工的每个manager_id。

manager.employee只有在您在manager.id上加入时才会给出正确的名称,这只发生在第二个查询中。

在ON条件下使用id的表的别名必须与使用employee列的表相同,所以manager.id - > manager.employee

对于每一行, manager_id指的是员工的经理。 这是由您的第二个查询描述的。 在这里,您将emp.manager_id与已连接表中的员工进行匹配。 断言由于id列而存在关系 - 换句话说,Ola的经理是manager_id为1的任何人。在这种情况下,Ahmed和Tove的manager_id都是1,所以它们都匹配。 HTH。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM