déjà, ça peut pas planter là où tu dis.
par contre, quand tu écris where id_groupe = (select ...)
Ca ne peut que planter : Oracle va même pas essayer de voir s'il y a 1 ou plusieurs lignes car la sous-requête peut syntaxiquement retourner plusieurs lignes...
Donc soit tu fais un IN, soit tu fais une fonction de regroupement sur l'IP, par exemple un max()
Mais de toute façon, y'a pas plus goret que ton code, passe par des jointures : ça sera plus propre, plus rapide, et il n'y aura pas de risque de plantage.