我需要在这张桌子上使用self join。

+------------+------+--------+
| Country    | Rank |  Year  |
+------------+------+--------+
|France      |  55  |  2000  |
+------------+------+--------+
|Canada      |  30  |  2000  |
+------------+------+--------+
|Liberia     |  59  |  2001  |
+------------+------+--------+
|Turkey      |  78  |  2000  |
+------------+------+--------+
|Japan       |  65  |  2003  |
+------------+------+--------+
|Romania     |  107 |  2001  |
+------------+------+--------+

我需要使用self-join来获取与土耳其有相同年份的国家。
仅显示国家和年份。
这就是我要做的。
SELECT DISTINCT a.Country, a.Year
FROM table1 AS a, table1 AS b
WHERE a.Year=b.Year and a.Country='Turkey';

^搜索self-join,然后成功了。
我只吃火鸡。我做错什么了?

最佳答案

你太接近了!
既然你说你展示的是土耳其的国家和年份,并且受到土耳其的限制,那么土耳其就是你将要看到的一切。您需要将select更改为A. CountryB.country或将where子句更改为B.year
这是使用一个交叉连接,它将变得越慢表中有更多的记录。

SELECT DISTINCT b.Country, b.Year
FROM table1 AS a,
     table1 AS b
WHERE a.Year=b.Year
  and a.Country='Turkey';

可以写成…可能会有相同的执行计划。
SELECT DISTINCT b.Country, b.Year
FROM table1 AS a
CROSS JOIN table1 AS b
WHERE a.Year=b.Year
  and a.Country='Turkey';


这使用了一个内部连接,它限制了引擎必须做的工作,并且不会像交叉连接那样受到性能下降的影响。
SELECT DISTINCT a.Country, a.Year
FROM table1 AS a
INNER JOIN table1 AS b
   on a.Year=b.Year
  and b.Country='Turkey';

为什么?
考虑当连接发生时sql引擎将做什么
甲、乙
+------------+------+--------+------------+------+--------+
| A.Country  | Rank |  Year  | B.Country  | Rank |  Year  |
+------------+------+--------+------------+------+--------+
|France      |  55  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+
|Turkey      |  78  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+
|France      |  55  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+
|Turkey      |  78  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+
|France      |  55  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+
|Turkey      |  78  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+

所以当你说displayB.countryA.Country其中A.Year是Turkey时,你可以看到它返回的全部是Turkey(因为只有1条记录是不同的)
但如果你真的是土耳其并且显示,你会得到法国,加拿大和土耳其!

07-24 09:37
查看更多