web-dev-qa-db-fra.com

Exécution d'une jointure interne pour plusieurs colonnes dans la même table

J'ai un scénario sur lequel je suis un peu coincé. Disons que j'ai une enquête sur les couleurs, et j'ai un tableau pour les données de couleur et un autre pour les réponses des gens.

tbColors

color_code , color_name
     1     , 'blue'
     2     , 'green'
     3     , 'yellow'
     4     , 'red'

tbAnswers

answer_id  ,  favorite_color   ,   least_favorite_color   ,  color_im_allergic_to
    1      ,         1          ,         2                            3  
    2      ,         3          ,         1                            4
    3      ,         1          ,         1                            2
    4      ,         2          ,         3                            4

Pour l'affichage, je veux écrire un SELECT qui présente le tableau des réponses mais en utilisant la colonne color_name de tbColors.

Je comprends la façon "la plus stupide" de le faire: nommer tbColors trois fois dans la section FROM, en utilisant un alias différent pour chaque colonne à remplacer.

À quoi ressemblerait une manière non stupide?

38
Frankie Simon

Cela semble être la voie à suivre:

SELECT
  A.answer_id
  ,C1.color_name AS favorite_color_name
  ,C2.color_name AS least_favorite_color_name
  ,C3.color_name AS color_im_allergic_to_name
FROM tbAnswers AS A
INNER JOIN tbColors AS C1
  ON A.favorite_color = C1.color_code
INNER JOIN tbColors AS C2
  ON A.least_favorite_color = C2.color_code
INNER JOIN tbColors AS C3
  ON A.color_im_allergic_to = C3.color_code

Plutôt que "stupide", je me risquerais à dire que c'est une requête assez standard. Cela suppose également que toutes les colonnes auront une valeur valide. Sinon, remplacez toutes les jointures INNER par des jointures LEFT

76
BradBrening