Det er klart, at du har dublerede værdier for begge sammenføjningskolonner. I stedet for det kartesiske produkt en [INNER] JOIN
ville producere til dette, vil du have, at hver række kun skal bruges én gang . Du kan opnå dette ved at tilføje et rækkenummer (rn
) pr. dublet og join på rn
desuden.
Hver tabel kan have flere eller færre duper for samme værdi end den anden, medmindre du har yderligere begrænsninger på plads (som en FK-begrænsning) - men der er intet i dit spørgsmål. For at beholde alle rækker man ville bruge en FULL [OUTER] JOIN
. Men du vil beholde 10.000 poster i resultatet, hvilket er kardinaliteten af table2
. Så det skal være en LEFT [OUTER] JOIN
på table1
(med 40 rækker) - og ekskluder mulige overdrevne rækker fra table1
.
SELECT t1."LocationArea", t2."Location"
FROM (
SELECT "Location"
, row_number() OVER (PARTITION BY "Location") AS rn
FROM table2
) t2
LEFT JOIN (
SELECT "LocationArea"
, row_number() OVER (PARTITION BY "LocationArea") AS rn
FROM table1
) t1 ON t1."LocationArea" = t2."Location"
AND t1.rn = t2.rn;
Virker til Postgres eller SQL Server. MySQL understøtter ikke vinduesfunktioner, du skal bruge en erstatning:
- SQL SELECT sidste post uden begrænsning
For at være tydelig:LEFT JOIN
er kun en forkortelse for LEFT OUTER JOIN
, så du bruger allerede en ydre joinforbindelse. Dit udsagn er en misforståelse :
Jeg bruger ZOHO-rapporter, som ikke understøtter ydre sammenføjninger.