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

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?

14
demandé sur Erwin Brandstetter 2012-05-23 01:14:04

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:

31
répondu Erwin Brandstetter 2017-05-23 12:33:57

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=...
8
répondu nosid 2012-05-22 21:17:46
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'
3
répondu RedFilter 2012-05-22 21:18:52