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.