Obviamente, você tem valores duplicados para ambas as colunas de junção. Em vez do produto cartesiano, um
[INNER] JOIN produziria para isso, você quer que cada linha seja usada apenas uma vez . Você pode conseguir isso adicionando um número de linha (rn ) por duplicata e junte-se em rn Além disso. Cada tabela pode ter mais ou menos dupes para o mesmo valor que a outra, a menos que você tenha restrições adicionais (como uma restrição FK) - mas não há nada em sua pergunta. Para manter todos linhas, um usaria um
FULL [OUTER] JOIN . Mas você quer manter 10.000 registros no resultado, que é a cardinalidade de table2 . Portanto, deve ser um LEFT [OUTER] JOIN na table1 (com 40 linhas) - e exclua possíveis linhas excessivas de 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;
Funciona para Postgres ou SQL Server. O MySQL não suporta funções de janela, você precisaria de um substituto:
- SQL SELECT última entrada sem limitação
Para ser claro:
LEFT JOIN é apenas um atalho para LEFT OUTER JOIN , então você já está usando uma junção externa. Sua declaração é um mal-entendido :
Estou usando relatórios ZOHO que não suportam associações externas.