我正在尝试了解 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
2) 查询不正确
Select *
FROM Employee e
INNER JOIN Employee m
ON m.ManagerId = e.Id
WHERE e.Salary > m.Salary
最佳答案
功能上顺序无关紧要(因此,“ON e.ManagerId = m.Id”与“ON m.Id = e.ManagerId”相同)。
你在这里做的是加入不同的列,代表不同的东西。
在错误的查询中,您说的是“经理 managerID 与员工 ID 相同”,这是不正确的。经理(如您在表中所列)本身没有经理。
您基本上所做的是反向连接。如果你要交换你的标志 where
语句,所以 WHERE e.Salary > m.Salary
至 WHERE e.Salary < m.Salary
你会得到与正确查询相同的答案
关于mysql - 了解自连接 (SQL) 中 ON 子句的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59815474/