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
。您无法仅通过位置唯一地识别 所有 人,即使您可以识别 大多数 人,因此您的结果似乎几乎有效。
我正在从本教程学习 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
。您无法仅通过位置唯一地识别 所有 人,即使您可以识别 大多数 人,因此您的结果似乎几乎有效。