Je zřejmé, že máte duplicitní hodnoty pro oba spojovací sloupce. Místo kartézského součinu [INNER] JOIN
chcete, aby byl každý řádek použit pouze jednou . Toho lze dosáhnout přidáním čísla řádku (rn
) za duplikát a připojte se na rn
navíc.
Každá tabulka může mít více nebo méně dup za stejnou hodnotu než druhá, pokud nemáte zavedena další omezení (jako omezení FK) – ale ve vaší otázce nic není. Chcete-li zachovat vše řádky by použily FULL [OUTER] JOIN
. Ale ve výsledku chcete zachovat 10 000 záznamů, což je mohutnost table2
. Musí to být tedy LEFT [OUTER] JOIN
na table1
(se 40 řádky) - a vyloučit možné nadměrné řádky z 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;
Funguje pro Postgres nebo SQL Server. MySQL nepodporuje funkce oken, budete potřebovat náhradu:
- Poslední záznam SQL SELECT bez omezení
Aby bylo jasno:LEFT JOIN
je jen zkratka pro LEFT OUTER JOIN
, takže již používáte vnější spojení. Vaše prohlášení je nedorozumění :
Používám sestavy ZOHO, které nepodporují vnější spojení.