sql >> Base de Datos >  >> RDS >> PostgreSQL

Qué tipo de JOIN usar

Obviamente, tiene valores duplicados para ambas columnas de unión. En lugar del producto cartesiano, un [INNER] JOIN produciría para esto, quiere que cada fila se use solo una vez . Puede lograr esto agregando un número de fila (rn ) por duplicado y unión en rn además.

Cada tabla puede tener más o menos duplicados por el mismo valor que la otra, a menos que tenga restricciones adicionales (como una restricción FK), pero no hay nada en su pregunta. Para mantener todo filas uno usaría un FULL [OUTER] JOIN . Pero desea mantener 10000 registros en el resultado, que es la cardinalidad de table2 . Por lo tanto, debe ser un LEFT [OUTER] JOIN en table1 (con 40 filas) - y excluye posibles filas excesivas 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 o SQL Server. MySQL no admite funciones de ventana, necesitaría un sustituto:

  • SQL SELECT última entrada sin límite

Para ser claros:LEFT JOIN es solo una abreviatura de LEFT OUTER JOIN , por lo que ya está utilizando una combinación externa. Su declaración es un malentendido :

Estoy usando informes de ZOHO que no admiten combinaciones externas.