semble simple, mais je suis coincéSQL JOIN question (encore un autre)
Table A Table B
col_a col_b col_a col_c
1 b 1 c
2 c 2 d
3 z 3 a
4 d 4 e
33 a 5 k
6 l
33 b
33 b
Je veux rejoindre le tableau A avec B:
select * from A inner join B on A.col_a = B.col_a
Je comptais obtenir 5 dossiers comme résultat.
Expected join result ** Actual result **
col_a col_b col_c col_x[n]... col_a col_b col_c col_y[n]...
1 b c ... 1 b c ...
2 c d ... 2 c d ...
3 z a ... 3 z a ...
4 d e ... 4 d e ...
33 a b ... 33 a b ...
33 a b ...
Pourquoi MySQL a-t-il correspondu à 33 deux fois? Parce qu'ils sont 2 valeurs avec 33 dans la table B.
Ce que je veux cependant, est juste un enregistrement avec la même valeur dans col_a. Comment je fais ça? Je suis mise à jour la conception des tables pour inclure plus de colonnes qui contiennent des données non identiques, car elles ont été posées plus de questions que de problèmes résolus. Quoi qu'il en soit, la réponse à cela est d'utiliser GROUP BY, mais la pénalité de performance est énorme, en particulier sur une table qui contient plus de 50 millions d'enregistrements (et de plus en plus). Cependant, la meilleure approche pour résoudre mon problème consistait à utiliser une instruction composée (en utilisant UNION ALL) pour chaque valeur distincte dans col_a. L'avantage de la performance était x5 ~ x10 plus rapide !!
notez l'absence de 'INNER' comme' JOIN' par lui-même est un 'INNER JOIN' par défaut. – vol7ron
la sous-requête n'est pas conseillée et dépend du plan de requête de la base de données. mais si vous avez ** beaucoup ** d'entrées en double dans les deux tables (quelle qu'en soit la raison), alors la sous-requête réduira le travail impliqué. – vol7ron
GROUP BY semble faire l'affaire (bien qu'il y ait une pénalité de performance)! –