PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Quel type de JOIN utiliser

De toute évidence, vous avez des valeurs en double pour les deux colonnes jointes. Au lieu du produit cartésien, un [INNER] JOIN produirait pour cela, vous voulez que chaque ligne ne soit utilisée qu'une fois . Vous pouvez y parvenir en ajoutant un numéro de ligne (rn ) par doublon et jointure sur rn en plus.

Chaque table peut avoir plus ou moins de dupes pour la même valeur que l'autre, sauf si vous avez des restrictions supplémentaires en place (comme une contrainte FK) - mais il n'y a rien dans votre question. Pour tout garder lignes on utiliserait un FULL [OUTER] JOIN . Mais vous voulez conserver 10000 enregistrements dans le résultat, qui est la cardinalité de table2 . Il doit donc s'agir d'un LEFT [OUTER] JOIN sur table1 (avec 40 lignes) - et exclure les éventuelles lignes excessives 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;

Fonctionne pour Postgres ou SQL Server. MySQL ne prend pas en charge les fonctions de fenêtre, vous auriez besoin d'un substitut :

  • SQL SELECT dernière entrée sans limitation

Pour être clair :LEFT JOIN est juste un raccourci pour LEFT OUTER JOIN , vous utilisez donc déjà une jointure externe. Votre déclaration est un malentendu :

J'utilise des rapports ZOHO qui ne prennent pas en charge les jointures externes.