Oczywiście masz zduplikowane wartości dla obu łączących się kolumn. Zamiast produktu kartezjańskiego [INNER] JOIN
dałoby to, chcesz, aby każdy wiersz był używany tylko raz . Możesz to osiągnąć, dodając numer wiersza (rn
) za duplikat i dołącz do rn
dodatkowo.
Każda tabela może mieć więcej lub mniej duplikatów dla tej samej wartości niż druga, chyba że masz dodatkowe ograniczenia (takie jak ograniczenie FK) - ale nie ma nic w twoim pytaniu. Aby zachować wszystkie wiersze, w których można by użyć FULL [OUTER] JOIN
. Ale chcesz zachować 10000 rekordów w wyniku, co odpowiada liczności table2
. Więc musi to być LEFT [OUTER] JOIN
na table1
(z 40 wierszami) - i wyklucz możliwe nadmiarowe wiersze 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;
Działa dla Postgres lub SQL Server. MySQL nie obsługuje funkcji okien, potrzebujesz zamiennika:
- Ostatni wpis SQL SELECT bez ograniczeń
Aby było jasne:LEFT JOIN
to tylko skrót od LEFT OUTER JOIN
, więc używasz już sprzężenia zewnętrznego. Twoje oświadczenie to nieporozumienie :
Używam raportów ZOHO, które nie obsługują złączeń zewnętrznych.