aide requête SQL : jointure tables 0-n

aide requête SQL : jointure tables 0-n - SQL/NoSQL - Programmation

Marsh Posté le 08-09-2009 à 14:14:39    

Bonjour à tous,
 
Voilà un petit temps que je n'ai plus fait de SQL et je cale sur une bêtise.
 
J'ai deux tables en relation 0-n :  
 
Table1 :  ID , label -- primary key ID
Table2 : Num, label, ref_ID -- primary key Num; ref_ID est foreign key vers Table1.
 
Les ID ne Table1 ne se retrouvent parfois pas dans Table2, et parfois plusieurs fois.
 
Je voudrais juste parcourir la Table1 et voir pour chaque row, si cet ID est repris dans Table2.ref_ID. Je ne veux que 1 row de résultat par row de Table1
 
Exemple de tables :  
Table1 :  
1, mylabel
2, monlabel
3, milabel
4, mijnlabel
 
Table2 :  
1, blabla, 1
2, blabla, 3
3, blabli, 3
 
Je voudrais une requête qui me sorte :  
1, mylabel, true
2, monlabel, false
3, milabel, true
4, mijnlabel, false
 
les "true" et "false" peuvent être les ID, les Num ou n'importe quoi comme valeur, mais je voudrais juste que je puisse , sur un et un seul row, savoir si l'ID se retrouve dans l'autre table.
 
-> Si je fais un INNER JOIN, je n'aurai QUE les IDs se retrouvent dans Table2.
-> Si je fais un LEFT OUTER JOIN, j'aurai autant de rows par Table1.ID qu'il y a de ce même ID dans Table2.ref_ID
 
Je suis persuadé qu'il doit y avoir un truc facile pour obtenir le résultat recherché ... un tuyau ?

Reply

Marsh Posté le 08-09-2009 à 14:14:39   

Reply

Marsh Posté le 08-09-2009 à 15:19:25    

tu utilises quel SGBD ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-09-2009 à 15:36:53    

MySQL 5, mais je pense que sur le serveur de prod c'est encore du 4  ... je peux procéder à l'upgrade si nécessaire, cela dit ..  (vieil hébergement mutualisé chez OVH tout ça ..)

Reply

Marsh Posté le 08-09-2009 à 15:50:41    

ben tu fais un left outer join, un group by sur ton label de ta table de 1, et un count(b.blabla) te renverras 0 pour les lignes sans correspondance et un nombre pour ceux avec correspondance.

Reply

Marsh Posté le 08-09-2009 à 16:16:18    

casimimir a écrit :

ben tu fais un left outer join, un group by sur ton label de ta table de 1


 
Merci pour la proposition! Comme tu t'en doutes, les labels peuvent être différents (j'ai réduit l'exemple à son minimum) donc exclu de faire un groupe by dessus.
 
J'essaye donc un group by sur les ID_ref , mais le résultat final, malgré le LEFT OUTER JOIN, ne donne que les rows de Table1 qui ont effectivement un ID présent dans Table2. ...  :cry:  en bref le group by n'aime pas les valeurs nulles, c'est-à-dire typiquement ce que retourne le LEFT OUTER JOIN quand il ne trouve rien dans l'autre table...


Message édité par ZeBix le 08-09-2009 à 16:23:56
Reply

Marsh Posté le 08-09-2009 à 17:39:55    

Je te fais une requête sans Access devant le nez, possible qu'il y'ait une ou 2 erreurs, et je sais même pas si ça marche ^^
 
Select ID , label, iif((Select Count(Num) From Table2 where Table2.ref_ID = t.ID)=0, False,True) From Table1 t

Reply

Marsh Posté le 08-09-2009 à 22:59:58    

je ne comprend pas pkoi left join/group by ne marcherai pas :
 
SELECT t1.*,COUNT(t2.num)  
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.id=t2.ref_id
GROUP BY t1.id
 
peux etre la synthaxe n est pas bonne :x
 

Reply

Marsh Posté le 08-09-2009 à 23:19:50    

xplo a écrit :

je ne comprend pas pkoi left join/group by ne marcherai pas :
 
SELECT t1.*,COUNT(t2.num)  
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.id=t2.ref_id
GROUP BY t1.id
 
peux etre la synthaxe n est pas bonne :x
 

Par contre, j'ai peur que le résultat soit pas joli pour les lignes où on n'a pas le t2.num (COUNT(NULL), ca donne quoi :??: )
Peut être encadrer ca par un IFNULL -> IFNULL(COUNT(t2.num), 0) ? [:figti]  

Reply

Marsh Posté le 09-09-2009 à 08:18:46    

count(null) retourne 0 (en tout cas en oracle) -> c'est joli

Reply

Sujets relatifs:

Leave a Replay

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