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.