PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Welche Art von JOIN soll verwendet werden?

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.