自连接(SQL)中ON子句的理解顺序

问题描述 投票:1回答:4

我正在尝试理解SQL自联接-尤其是ON子句的顺序在查询中如何起作用。这可能是一个基本问题,但是请耐心等待,因为我是查询语言的初学者。

这实际上是LeetCode Question - #181,我正在这里寻找薪水高于其经理的员工。您可以通过LeetCode链接或下面提供的SQL Fiddle示例检出该模式。

问题:

基本上,当我运行以下两个查询时,我试图理解输出的差异:

我将ON子句的顺序更改为从(ON e.ManagerId = m.Id)到(ON m.ManagerId = e.Id)] >>,我得到了所需输出的反答案。我以为是自连接,所以顺序无关紧要,因为我是从同一张表中提取信息。

请让我知道我想念的东西,如果可能的话,还要指出任何方向!提前致谢!

1)正确查询以获取所需的输出

Select *
FROM Employee e
INNER JOIN Employee m
ON e.ManagerId = m.Id
WHERE e.Salary > m.Salary

SQL Fiddle Example

2)错误查询

Select *
FROM Employee e
INNER JOIN Employee m
ON m.ManagerId = e.Id
WHERE e.Salary > m.Salary

SQL Fiddle Example

我正在尝试理解SQL自联接-尤其是ON子句的顺序在查询中如何起作用。这可能是一个基本问题,但请耐心等待,因为我是查询初学者...

mysql sql join rdbms self-join
4个回答
2
投票

在两个查询中,您正在将一个雇员与另一个雇员合并。但是,在第一个查询中,您叫下属e和经理m,而在第二个查询中,您叫经理e和下属m。让我们仔细看看:

Select *
FROM Employee e
INNER JOIN Employee m
ON e.ManagerId = m.Id
WHERE e.Salary > m.Salary

1
投票

在功能上顺序无关紧要(因此,'ON e.ManagerId = m.Id'与'ON m.Id = e.ManagerId'相同。)>]

[您在这里所做的工作是在不同的列上联接,这些列代表不同的事物。


0
投票

[我认为您没有意识到餐桌上的餐桌是指人们。该表的m副本是管理器,因此变量m.managerId将引用管理器的管理器。这不是您想要的。所以正确的链接:

e.ManagerId = m.Id


0
投票

[您可能会想起来,因为只有Manager_id列中的id是Managers因此,要获得他们的名字,可以>

select name from Employee where id in (select ManagerId from Employee)

尝试运行不带where子句的查询,您将看到相同的结果,但列顺序已更改。这是因为有ON子句:

© www.soinside.com 2019 - 2024. All rights reserved.