MySql 自连接意外结果内连接

MySql self join unexpected result inner join

我正在从本教程学习 SQL 联接:http://www.programmerinterview.com/index.php/database-sql/what-is-a-self-join/

他们使用的 table 是:

+---------------+-------------------+
| employee_name | employee_location |
+---------------+-------------------+
| Joe           | New York          |
| Sunil         | India             |
| Alex          | Russia            |
| Albert        | Canada            |
| Jack          | New York          |
+---------------+-------------------+

我决定通过省略某些部分来试验查询:

select * from
employee t1, employee t2
where t1.employee_location = t2.employee_location

这个查询看起来很简单。 “匹配位置相同的人。我想好吧,结果是这样的:

+---------------+-------------------++---------------+-------------------+
| employee_name | employee_location || employee_name | employee_location |
+---------------+-------------------++---------------+-------------------+
| Joe           | New York          || Joe           | New York          |
| Sunil         | India             || Sunil         | India             |
| Alex          | Russia            || Alex          | Russia            |
| Albert        | Canada            || Albert        | Canada            |
| Jack          | New York          || Jack          | New York          |
+---------------+-------------------++---------------+-------------------+

但是我得到的不是上面的:

+---------------+-------------------+---------------+-------------------+
| employee_name | employee_location | employee_name | employee_location |
+---------------+-------------------+---------------+-------------------+
| Joe           | New York          | Joe           | New York          |
| Jack          | New York          | Joe           | New York          |
| Sunil         | India             | Sunil         | India             |
| Alex          | Russia            | Alex          | Russia            |
| Albert        | Canada            | Albert        | Canada            |
| Joe           | New York          | Jack          | New York          |
| Jack          | New York          | Jack          | New York          |
+---------------+-------------------+---------------+-------------------+

对 Sunil、Alex 和 Albert 来说效果很好。乔和杰克的组合我不明白。除了解决方案之外,有人可以详细解释这是如何工作的吗?我想了解这个结果背后的逻辑。

答案就在"where"语句中: 其中 t1.employee_location = t2.employee_location Joe 和 Jack 都与 New York 匹配,因此相乘。 您可以通过添加另一个纽约条目并重新 运行 来更好地看到这一点。您将获得 9 个纽约结果。 要获得您期望的结果,您需要添加 "and where t1.employee_name = t2.employee_name.

t1 中的每一行纽约都与 t2 中的两行相匹配,因为您所需要的只是城市相同。所以你得到纽约的 2 x 2 总匹配(对)。如果您添加第三个纽约,那么您将得到 9 行。

要查看您期望的行为,请尝试添加 and t1.employee_name = t2.employee.name。您无法仅通过位置唯一地识别 所有 人,即使您可以识别 大多数 人,因此您的结果似乎几乎有效。