Table de jointure deux fois sur deux colonnes différentes de la même table
j'ai une base de données très confuse avec une table qui contient deux valeurs dont j'ai besoin dans une table séparée. Voici mon problème:
Table1
- id
Table2
- id
- table1_id
- table3_id_1
- table3_id_2
Table3
- id
- value
j'ai besoin d'aller de table1 et faire une jointure qui pourrait me donner la valeur de table3
dans deux colonnes séparées. Si je veux quelque chose comme ceci:
table1.id | table2.id | table2.table3_id_1 | table2.table3_id_2 | X | Y
Où X
et Y
sont les valeurs de la ligne connectée par table3_id_1
et table3_id_2
respectivement.
peut-être en faire des variables ou quelque chose comme ça je peux filtrer dans un WHERE
l'article?
3 réponses
SELECT t2.table1_id
, t2.id AS table2_id
, t2.table3_id_1
, t2.table3_id_2
, t31.value AS x
, t32.value AS y
FROM table2 t2
LEFT JOIN table3 t31 ON t31.id = t2.table3_id_1
LEFT JOIN table3 t32 ON t32.id = t2.table3_id_2;
il n'y a pas besoin de se joindre à table1
. table2
a tout ce dont vous avez besoin - en supposant qu'il y ait un contrainte de clé étrangère garantir l'intégrité référentielle (tous t2.table1_id
dans table1
). Autre chose que vous voulez vous joindre à table1
, sélectionnant ainsi seulement les lignes présentes dans table1
.
j'utilise LEFT [OUTER] JOIN
(et non [INNER] JOIN
) pour rejoindre à la fois les instances de table3
pour une raison similaire: il n'est pas clair si l'intégrité référentielle est garantie-et si l'une des colonnes clés peut être nulle. [INNER] JOIN
baisse de lignes du résultat où aucune correspondance n'est trouvée. Je suppose que vous préféreriez afficher de telles lignes avec un NULL
valeur manquante x
ou y
.
Et table3.id
doit être UNIQUE
, ou nous pourrions multiplier les lignes avec plusieurs matches de chaque LEFT JOIN
:
si vous rejoignez plusieurs fois une table, utilisez des alias pour les distinguer:
SELECT table1.id,table2.id,table2.table3_id_1,table2.table3_id_2,t3_1.id,t3_2.id
FROM table1
JOIN table2 ON table1.id=table2.table1_id
JOIN table3 t3_1 ON table2.table3_id_1=t3_1.id
JOIN table3 t3_2 ON table2.table3_id_2=t3_2.id
WHERE ... t3_1.id=... AND ... t3_2.id=...
select t1.id as table1_id,
t2.id as table2_id,
t2.table3_id_1,
t2.table3_id_2,
t3_1.value as X,
t3_2.value as Y
from Table1 t1
inner join Table2 t2 on t1.id = t2.table1_id
inner join Table3 t3_1 on t2.table3_id_1 = t3_1.id
inner join Table3 t3_2 on t2.table3_id_2 = t3_2.id
where t3_1.value = 'some_value'
or t3_2.value = 'some_other_value'