Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySql. Como usar o Self Join


Você está tão perto!

Como você diz que está exibindo o país e o ano de A e limitando por A. Country da Turquia, a Turquia é tudo que você vai ver. Você precisa alterar as seleções para B.country e B.year ou altere a cláusula where para B.country .

Isso está usando uma junção cruzada que ficará mais lenta quanto mais registros houver em uma tabela.
SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a, 
     table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

poderia ser escrito como... e provavelmente teria o mesmo plano de execução.
SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a 
CROSS JOIN table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

OR Isso usa um INNER JOIN que limita o trabalho que o mecanismo deve fazer e não sofre degradação de desempenho que uma junção cruzada causaria.
SELECT DISTINCT a.Country, a.Year 
FROM table1 AS a 
INNER JOIN table1 AS b 
   on a.Year=b.Year 
  and b.Country='Turkey';

POR QUÊ:

Considere o que o mecanismo SQL fará quando a junção ocorrerA B
+------------+------+--------+------------+------+--------+
| 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  |
+------------+------+--------+------------+------+--------+ 

Então, quando você disse exibir A.Country e A.Year onde A.Country é a Turquia, você pode ver tudo o que pode retornar é a Turquia (devido ao distinto apenas 1 registro)

Mas se você fizer B.Country é a Turquia e exibe A.Country , você terá França, Canadá e Turquia!