Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème de requete avec jointure

1 réponse
Avatar
richard
Bonjour,

A partir de 2 tables (une table d'élément et une table de liens), je
cherche le moyen d'obtenir une liste contenant tous les éléments d'un
type (type1) et leur lien avec un autre type (type2), et les éléments
(de type1) ne disposant pas de liens (avec les élément de type2).

La table des éléments contient des éléments de types différents
identifiés par le champs "TYPE"
La table des liens permet d'associer les éléments entre eux quelque
soit leur type. Et bien sûr un élément d'un type peut être lié à
plusieurs autres éléments de type différents.

J'ai fait une requête du type
Code :

select *
from table_element T0
left join table_lien T1 on (T0.id = T1.id1) or (T0.id = T1.id2)
left join table_element T2 on (T1.id1=T2.id) or (T1.id2 = T2.id)
where T0.type = type1 and (T2.type = type2 or T2.type is null)

La requete fonctionne bien, sauf si un élément de type1 est lié à un
autre élément de type quelconque mais pas à un élément de type2 (il
n'apparait pas dans le résultat)

Je ne vois pas comment faire ma requete pour ne faire un test de lien
et de non lien avec seulement le élément d'un type spécifé sans
m'occuper des autres type d'éléments.

Merci de votre aide.

1 réponse

Avatar
Steve Kass
Richard,

Si vous cherche
tous les éléments de type 1 lié avec un élément de type 2
et aussi
tous les éléments de type 1 non lié avec un élément de type 2

vous également cherche tous les élement de type 1, lié ou non lié
à un élément de n'importe quel type. Donc ne pas ajouter une
condition WHERE qu'élimine certains élements de T0.

Vous ne voulez garder que le fait qu'un élément est lié ou
non à un type 2, puis la condition ON (du join T1-T2)
ne sera vrai qu'au cas que T2.type = type2 et T2.id est
T1.id1 ou T1.id2.

Essayez:

select *
from table_element T0
left join table_lien T1
on (T0.id = T1.id1) or (T0.id = T1.id2)
left join table_element T2
on T2.type = 'type2'
and (
(T1.id1=T2.id) or (T1.id2 = T2.id)
)
where T0.type = 'type1'

[pas testé]

-- Steve Kass
-- Drew University
-- DCE49277-7282-42EF-9A54-EEA3A37D86DE


richard wrote:

Bonjour,

A partir de 2 tables (une table d'élément et une table de liens), je
cherche le moyen d'obtenir une liste contenant tous les éléments d'un
type (type1) et leur lien avec un autre type (type2), et les éléments
(de type1) ne disposant pas de liens (avec les élément de type2).

La table des éléments contient des éléments de types différents
identifiés par le champs "TYPE"
La table des liens permet d'associer les éléments entre eux quelque
soit leur type. Et bien sûr un élément d'un type peut être lié à
plusieurs autres éléments de type différents.

J'ai fait une requête du type
Code :

select *
from table_element T0
left join table_lien T1 on (T0.id = T1.id1) or (T0.id = T1.id2)
left join table_element T2 on (T1.id1=T2.id) or (T1.id2 = T2.id)
where T0.type = type1 and (T2.type = type2 or T2.type is null)

La requete fonctionne bien, sauf si un élément de type1 est lié à un
autre élément de type quelconque mais pas à un élément de type2 (il
n'apparait pas dans le résultat)

Je ne vois pas comment faire ma requete pour ne faire un test de lien
et de non lien avec seulement le élément d'un type spécifé sans
m'occuper des autres type d'éléments.

Merci de votre aide.