mysql - 了解自连接 (SQL) 中 ON 子句的顺序

标签 mysql sql join rdbms self-join

我正在尝试了解 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

最佳答案

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

你在这里做的是加入不同的列,代表不同的东西。

在错误的查询中,您说的是“经理 managerID 与员工 ID 相同”,这是不正确的。经理(如您在表中所列)本身没有经理。

您基本上所做的是反向连接。如果你要交换你的标志 where语句,所以 WHERE e.Salary > m.SalaryWHERE e.Salary < m.Salary你会得到与正确查询相同的答案

关于mysql - 了解自连接 (SQL) 中 ON 子句的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59815474/

相关文章:

php - 在 Wordpress 中使用 meta_query 查询经过清理的数据

php - 在php中重复数组日期

mysql - 在 Web 应用程序中,1 个连接查询 4 ​​个表或 4 个单独的数据库调用哪个更可靠?

MySQL 加入 + "WHERE something=MAX(something)"

oracle - 更新加入权限不足

MYSQL insert into table with one column's data pulled from another table

php - mysql数据来自2个表

sql - Teradata SQL 或 SAS SQL 中的统计 MODE 函数

sql - Postgresql 中的不同类型.. 如何正确执行此操作?

SQL 服务器 : Get record with date closest to given date