2016-12-20 2 views
-1

J'ai table qui devrait se joindre à une autre table basée sur l'identifiant unique. Si je fais LEFT OUTER JOIN ON, je vais avoir des doublons. Si je mets DISTINCT dans mon SELECT j'obtiendrai le nombre correct d'enregistrements. Ensuite, si j'inclus un champ de la table que j'ai fait LEFT OUTER JOIN dans ce cas, je reçois à nouveau des doublons. Voici ma question:SQL Left Outer Join?

SELECT DISTINCT 
Table1.fname, 
Table1.lname, 
Table2.address 
FROM Table1 
LEFT OUTER JOIN Table2 
ON Table2.user_id = Table1.userid 

Dans l'exemple ci-dessus, je reçois des doublons, j'ai aussi essayé de le faire:

LEFT OUTER JOIN (
    SELECT user_id 
    FROM Table2 
    GROUP BY user_id 
) AS t2 ON Table1.user_id = t2.user_id 

Cela m'a donné bon nombre de dossiers, mais j'ai besoin des colonnes supplémentaires de cette deuxième table, après avoir inclus des colonnes supplémentaires, je suis en train de doublons à nouveau, par exemple:

LEFT OUTER JOIN (
    SELECT user_id, address 
    FROM Table2 
    GROUP BY user_id, address 
) AS t2 ON Table1.user_id = t2.user_id 

Je me demande si je raté quelque chose ou il y a une meilleure façon de gérer ce type de problème. Si quelqu'un voit quelque chose ou connaît mieux la solution s'il vous plaît faites le moi savoir.

+1

Quelle est la clé primaire pour le tableau 2? –

+4

Vous obtenez des doublons de DISTINCT avec ces colonnes supplémentaires, car ils ont plusieurs valeurs. Nous ne pouvons pas vous dire comment le réparer, à moins que vous ne puissiez nous dire * lesquelles * de ces valeurs multiples que vous voulez de ces colonnes. – RBarryYoung

+1

Peut-on voir des données? – coderredoc

Répondre

1

Il est impossible pour vous de choisir la bonne réponse ici sans comprendre vos données. Il semble que Table2 supporte plusieurs address es par user_id. C'est un design commun. Si vous voulez retourner une seule address par user_id vous avez plusieurs options:

  1. Fixer les données - Retirer les adresses en double du tableau 2 et ajouter une contrainte qui empêche à nouveau cette situation. Vous devrez déterminer quelles adresses sont incorrectes.
  2. Réduire la jointure à gauche pour n'inclure qu'une seule adresse par utilisateur - La façon dont vous le faites dépendra de vos autres données. Vous pouvez utiliser min() ou max() avec un group by si vous ne voulez pas lequel retourner où il y a des multiples ou vous devrez peut-être commander par une date d'entrée en vigueur et prendre la dernière - ou peut-être il y a des adresses de facturation et d'expédition devrait choisir le bon.
  3. Acceptez qu'il y ait plusieurs adresses par utilisateur - cela peut être correct - et ajustez le reste de votre code.