我正在学习本教程中的SQL连接:http://www.programmerinterview.com/index.php/database-sql/what-is-a-self-join/
他们使用的表是:
+---------------+-------------------+
| 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。 Joe和Jack的组合我不明白。有人可以详细解释除解决方案之外的其他方法吗?我想了解这个结果背后的逻辑。
答案 0 :(得分:1)
t1
中的每一个纽约行与t2
中的两行匹配,因为您要求的是城市是相同的。所以你得到纽约的2 x 2总比赛(对)。如果您添加了第三个纽约,那么您将获得9行。
要查看您期望的行为,请尝试添加and t1.employee_name = t2.employee.name
。您无法单独按位置唯一标识所有人员,即使您可以使用大多数,因此您的结果几乎可以正常工作。
答案 1 :(得分:0)
答案在于"其中"声明: 其中t1.employee_location = t2.employee_location 乔和杰克都与纽约相匹配,因此成倍增加。 您可以通过添加另一个纽约条目并重新运行来更好地看到这一点。您将获得9个纽约结果。 要获得预期,您需要添加"以及t1.employee_name = t2.employee_name。