Question sur les jointures

Question sur les jointures - SQL/NoSQL - Programmation

Marsh Posté le 31-05-2006 à 12:29:02    

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 :

Code :
  1. select *
  2. from table_element T0
  3. left join table_lien T1 on (T0.id = T1.id1) or (T0.id = T1.id2)
  4. left join table_element T2 on (T1.id1=T2.id) or (T1.id2 = T2.id)
  5. where T0.type = type1
  6. 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.

Reply

Marsh Posté le 31-05-2006 à 12:29:02   

Reply

Marsh Posté le 01-06-2006 à 22:15:29    

salut, j'ai regardé un peu et voici ce que je propose (ca n'a pas été testé)
 
 [:sharpknife]  

Code :
  1. select * from table_element e1
  2. where e1.type = type1
  3. and exists (select * from table_lien lien1
  4.                 where e1.id = lien1.id1
  5.                    and exists (select * from table_element e2
  6.                                    where lien1.id2 = e2.id
  7.                                        and e2.type = type2
  8.                                   )
  9.                 )
  10. union
  11. select * from table_element e3
  12. where e3.type = type1
  13. and NOT exists (select * from table_lien lien2
  14.                 where e3.id = lien2.id1
  15.                    and exists (select * from table_element e4
  16.                                    where lien2.id2 = e4.id
  17.                                        and e4.type = type2
  18.                                   )
  19.                 )


 
voila
 [:fast]  
ce fut un plaisir, j'espere que ca marche pcq l'enoncé n'est pas super super comprehensible.
 
edit : heureuseùment que je me suis relu plusieurs fois, j'avais oublié le "NOT" exists


Message édité par polo021 le 01-06-2006 à 22:19:30
Reply

Marsh Posté le 16-06-2006 à 10:15:56    

Salut,
 
Désolé d'avoir été impoli et de ne pas avoir répondu plus tôt, Mais j'ai été pros par d'autres trucs plus urgents.
 
Donc déjà merci de d'être penché sur mon problème.
 
Je vais essayé ton truc. Sinon il pourrai y avoir une autre solution qui sera d'ajouté une clause de vérification du type dans un premier inner join.
Je fais les tests et je te tiens au courant.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed