关注自我加入

时间:2017-04-19 02:16:07

标签: sql oracle

我正在学习使用SQL进行编程,并且关注为什么以下自连接的行为方式如此。

我加入的表是EMPLOYEES表: EMPLOYEES

我正在尝试将每个员工的last_name和employee_id与他们各自的经理的last_name和employee_id相匹配。

以下两个查询完成此任务,但输出完全不同:

select w.last_name, w.employee_id, m.last_name as manager, m.employee_id as manager_id
from employees w join employees m
on (w.manager_id = m.employee_id);

返回:

Result 1

select w.last_name, w.employee_id, m.last_name as manager, m.employee_id as manager_id
from employees w join employees m
on (w.employee_id = m.manager_id);

返回:

Result 2

根据我的理解,这两个查询应该具有相同的结果,因为(w.manager_id = m.employee_id)在逻辑上等同于(w.employee_id = m.manager_id)

那么,为什么结果如此截然不同?

2 个答案:

答案 0 :(得分:1)

  

"这两个查询应该具有相同的结果,因为(w.manager_id = m.employee_id)在逻辑上等同于(w.employee_id = m.manager_id)"

一点。 manager_id引用的逻辑表是托管的集合; employee_id引用的逻辑表是管理员的集合

在您的第一个查询中,逻辑表M是管理员的集合,在第二个查询中,它是托管的集合。除非您在翻转连接时没有翻转列别名,否则这并不重要。因此m.employee_id as manager_id在第一个查询中是正确的,但在第二个查询中是错误的。它的标签与数据不同。

您对结果集进行排序后会更清楚。将order by m.employee_id, w.manager_id添加到第一个查询,将order by w.employee_id, m.manager_id添加到第二个查询,您将更容易调整两个输出。

答案 1 :(得分:0)

经过时尚后,两个查询返回相同的结果。他们从相反的方向看待同样的关系。

在一种情况下,经理出现在最左侧的列中,而另一列出现在最右侧的列中。同一对,不同的表现。