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.