sql >> Databasteknik >  >> RDS >> Mysql

MySql. Hur man använder Self Join

Du är så nära!

Eftersom du säger att du visar land och år från A och begränsar med A. Country av Turkiet, Turkiet är allt du kommer att se. Du måste antingen ändra valen för att vara B.country och B.year eller ändra where-satsen så att den blir B.country .

Detta använder en korskoppling som blir långsammare ju fler poster det finns i en tabell.

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

skulle kunna skrivas som... och skulle sannolikt ha samma utförandeplan.

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

ELLERDen här använder en INNER JOIN som begränsar det arbete som motorn måste göra och inte lider av prestandaförsämring som en tvärskarvning skulle göra.

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

VARFÖR:

Tänk på vad SQL-motorn kommer att göra när kopplingen skerA 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  |
+------------+------+--------+------------+------+--------+ 

Så när du sa visa A.Country och A.Year där A.Country är Turkiet, du kan se allt det kan returnera är Turkiet (på grund av den distinkta endast 1 posten)

Men om du gör B.Country är Turkiet och visar A.Country , får du Frankrike, Kanada och Turkiet!



  1. TRIM() Funktion i Oracle

  2. Fix Msg 8116 "Argumentdatatypen varchar är ogiltig för argument 1 för session_context-funktionen" i SQL Server

  3. Fel vid konvertering av datatyper vid import från Excel till SQL Server 2008

  4. Vad är en överordnad tabell och en underordnad tabell i databasen?