【发布时间】:2018-10-23 17:42:48
【问题描述】:
在 Stack Overflow 上提出了以下问题:
“我需要在这个表上使用 Self Join。
+------------+------+--------+
| Country | Rank | Year |
+------------+------+--------+
|France | 55 | 2000 |
+------------+------+--------+
|Canada | 30 | 2000 |
+------------+------+--------+
|Liberia | 59 | 2001 |
+------------+------+--------+
|Turkey | 78 | 2000 |
+------------+------+--------+
|Japan | 65 | 2003 |
+------------+------+--------+
|Romania | 107 | 2001 |
+------------+------+--------+
我需要使用自我加入来获取与土耳其相同年份的国家/地区。仅显示国家和年份。”
在选择正确的答案中,推荐的查询之一是:
SELECT DISTINCT a.Country, a.Year
FROM table1 AS a
INNER JOIN table1 AS b
on a.Year=b.Year
and b.Country='Turkey';
我没有收到此查询。不是a.Year=b.Year 总是正确的——因为两张表都是一样的吗?那么使用它有什么需要呢?
而且上面的查询不是只返回国内的'Turkey'吗?
如果我错了,请帮助我理解。
非常感谢!
【问题讨论】:
-
通过查询添加您的预期输出以及您将应用什么条件
-
a.Year=b.Year是一个连接条件。它并不总是正确的,因为表格中的每一年都与其他年份不同。查询应返回法国、加拿大和土耳其。你可以随时just test run and see -
DISTINCT只有在表可以包含土耳其的多条记录时才有意义。请参阅蒂姆的回答;无论如何都可以使用子查询而不是联接来解决此类任务。 -
这是一个常见问题解答,您在问 select 语句是如何工作的。请阅读How to Ask 和向下投票箭头鼠标悬停文本。 (条件告诉您要从交叉连接中保留哪些行——您可以从每个输入的一行中创建的每一行中保留哪些行。)PS Re self-join.