Offensichtlich haben Sie doppelte Werte für beide Verbindungsspalten. Statt des kartesischen Produkts ein [INNER] JOIN
dafür produzieren würde, soll jede Zeile nur einmal verwendet werden . Sie können dies erreichen, indem Sie eine Zeilennummer hinzufügen (rn
) pro Duplikat und treten Sie auf rn
bei zusätzlich.
Jeder Tisch kann mehr oder weniger Duplikate für denselben Wert haben als der andere, es sei denn, Sie haben zusätzliche Einschränkungen (wie eine FK-Einschränkung) - aber Ihre Frage enthält nichts. Um alle zu behalten Zeilen würde man einen FULL [OUTER] JOIN
verwenden . Aber Sie möchten 10000 Datensätze im Ergebnis behalten, was der Kardinalität von table2
entspricht . Es muss also ein LEFT [OUTER] JOIN
sein auf table1
(mit 40 Zeilen) - und schließen Sie mögliche überzählige Zeilen aus table1
aus .
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;
Funktioniert für Postgres oder SQL Server. MySQL unterstützt keine Fensterfunktionen, Sie bräuchten einen Ersatz:
- SQL SELECT letzter Eintrag ohne Einschränkung
Um es klar zu sagen:LEFT JOIN
ist nur eine Abkürzung für LEFT OUTER JOIN
, Sie verwenden also bereits einen äußeren Join. Ihre Aussage ist ein Missverständnis :
Ich verwende ZOHO-Berichte, die Outer Joins nicht unterstützen.