你这么近!
既然您说您要显示来自 A 和限制A. Country
的土耳其的国家和年份,那么您将看到的只是土耳其。您需要将选择更改为B.country
andB.year
或将 where 子句更改为B.country
。
这是使用交叉连接,表中记录越多,交叉连接就越慢。
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 引擎会做什么 AB
+------------+------+--------+------------+------+--------+
| 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 |
+------------+------+--------+------------+------+--------+
所以当你说显示A.Country
和土耳其A.Year
在哪里时A.Country
,你可以看到它只能返回土耳其(由于唯一的 1 条记录)
但如果你做B.Country
的是土耳其和展示A.Country
,你会得到法国、加拿大和土耳其!