Uppenbarligen har du dubbletter av värden för båda de sammanfogade kolumnerna. Istället för den kartesiska produkten en [INNER] JOIN
skulle producera för detta vill du att varje rad endast ska användas en gång . Du kan uppnå detta genom att lägga till ett radnummer (rn
) per dubblett och gå med på rn
dessutom.
Varje tabell kan ha fler eller färre duper för samma värde än den andra om du inte har ytterligare restriktioner på plats (som en FK-begränsning) - men det står ingenting i din fråga. För att behålla alla rader ett skulle använda en FULL [OUTER] JOIN
. Men du vill behålla 10 000 poster i resultatet, vilket är kardinaliteten för table2
. Så det måste vara en LEFT [OUTER] JOIN
på table1
(med 40 rader) - och exkludera eventuella överdrivna rader från 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;
Fungerar för Postgres eller SQL Server. MySQL stöder inte fönsterfunktioner, du skulle behöva en ersättning:
- SQL SELECT senaste posten utan begränsning
För att vara tydlig:LEFT JOIN
är bara en förkortning för LEFT OUTER JOIN
, så du använder redan en yttre koppling. Ditt uttalande är ett missförstånd :
Jag använder ZOHO-rapporter som inte stöder yttre anslutningar.