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.