PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Que tipo de JOIN usar


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.