2009-12-14 4 views
3

J'ai une table (x) qui a 9 millions de lignes et une de ses colonnes est cosub qui a des valeurs dupliquées répétées, il y a une autre table (y) a des détails connexes pour cosub il a 59k lignes et des colonnes supplémentaires qui fournissent des détails liés à cosub (agissant comme table de recherche) comment puis-je joindre les deux tables, interrogeant 9 millions de lignes et en sélectionnant des détails supplémentaires sur le cosub. exemple:Joindre deux tables en utilisant une colonne qui a des valeurs dupliquées, tables de consultation maître

Table x  table y 
id cosub cosub div 

1 A  B  6 
2 B  A  5 
3 C  C  7 
4 A  A  5 
5 B  B  6 
6 C  A  5 
..................... 

le résultat de la requête devrait ressembler à ceci (en sélectionnant les 9 millions de lignes de la table x)

1 A 5
2 B 6
3 C 7
4 A 5
5 B 6
6 C 7

+0

Quelle base de données utilisez-vous? –

Répondre

1
SELECT DISTINCT X.id, X.cosub, Y.div 
FROM X 
LEFT OUTER JOIN Y ON Y.cosub = X.cosub 
-- WHERE xxxx here for optional where condition 
-- ORDER BY xxxx here for optional ordering clause 

Je ne suis pas 100 % sûr que vous avez besoin DISTINCT (il serait bon de l'éviter), cela dépend si la petite table a des doublons. Le texte de la question semble ne pas impliquer de tels doublons, mais alors l'exemple donne des shows dups ...

Méfiez-vous également que dans le cas où la table Y a plusieurs valeurs div pour un cosub donné (ie plusieurs enregistrements avec des valeurs div conflictuelles) pour un cosub donné), la requête ci-dessus aboutirait à afficher plusieurs lignes dans la liste des résultats, une par valeur différente (mais en répétant les données de la table X). Enfin, l'extrait proposé est utilisé et LEFT OUTER JOIN, ce qui permettrait au résultat d'inclure des enregistrements avec seulement les données de la table X (et des valeurs nulles au lieu des valeurs des champs provenant normalement de Y), dans le cas où un L'enregistrement X a une valeur cosub introuvable dans Y. L'alternative est d'utiliser simplement JOIN, ce qui aura pour effet d'EXCLURE un tel enregistrement de la liste des résultats (ie le résultat ne comprendra alors que les enregistrements de X à condition qu'ils aient un cosub qui existe en Y)

+0

nous n'avons pas besoin de distinct pour la table X car l'identifiant de valeur est unique/clé primaire seulement cosub a répéter les doublons. table y a des doublons dans le cosub donc je vais devoir utiliser distinct pour cela. – user218903

+0

@ nazer555 Je vous suggère de supprimer ces doublons dans Y avant de continuer, vous permettant d'éviter le "DISTINCT" dans la requête qui pourrait ralentir considérablement les choses. – mjv

+0

toutes les valeurs trouvées dans cosub de X ont une valeur correspondante dans la colonne cosub de la table Y. chaque instance de valeur cosub a des valeurs div différentes et cela rend très difficile la jointure – user218903

1

utilisation:

SELECT DISTINCT 
      x.id, 
      x.cosub, 
      y.div 
    FROM TABLE_x x 
LEFT JOIN (SELECT t.cosub, 
        t.div, 
        --other columns 
      FROM TABLE_Y t) y ON y.cosub = x.cosub 

d'après les commentaires que j'ai lu, vous avez besoin d'effectuer une pré-processus les enregistrements dans TABLE_Y pour obtenir les valeurs div/etc correctes avant de renvoyer un ensemble de résultats.

+0

C'est presque juste, mais vous devez ajouter un 'distinct' au second choix interne. –

+0

Mise à jour pour ajouter 'DISTINCT' –

Questions connexes