我正在学习使用SQL进行编程,并且关注为什么以下自连接的行为方式如此。
我正在尝试将每个员工的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);
返回:
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);
返回:
根据我的理解,这两个查询应该具有相同的结果,因为(w.manager_id = m.employee_id)在逻辑上等同于(w.employee_id = m.manager_id)
那么,为什么结果如此截然不同?
答案 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)
经过时尚后,两个查询返回相同的结果。他们从相反的方向看待同样的关系。
在一种情况下,经理出现在最左侧的列中,而另一列出现在最右侧的列中。同一对,不同的表现。