PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Che tipo di JOIN usare

Ovviamente, hai valori duplicati per entrambe le colonne di unione. Al posto del prodotto cartesiano un [INNER] JOIN produrrebbe per questo, vuoi che ogni riga venga utilizzata solo una volta . Puoi ottenerlo aggiungendo un numero di riga (rn ) per duplicato e iscriviti su rn in aggiunta.

Ogni tabella può avere più o meno duplicati per lo stesso valore dell'altra a meno che tu non abbia restrizioni aggiuntive in atto (come un vincolo FK), ma non c'è nulla nella tua domanda. Per mantenere tutti righe uno userebbe un FULL [OUTER] JOIN . Ma vuoi mantenere 10000 record nel risultato, che è la cardinalità di table2 . Quindi deve essere un LEFT [OUTER] JOIN su table1 (con 40 righe) - ed escludere eventuali righe in eccesso da 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;

Funziona per Postgres o SQL Server. MySQL non supporta le funzioni della finestra, avresti bisogno di un sostituto:

  • Ultima voce SQL SELECT senza limitazioni

Per essere chiari:LEFT JOIN è solo un'abbreviazione per LEFT OUTER JOIN , quindi stai già utilizzando un outer join. La tua affermazione è un malinteso :

Sto usando rapporti ZOHO che non supportano gli outer join.