Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre émérite
    SELECT avec contraintes sur plusieurs lignes du set de résultats
    Bonjour,
    dans le cadre d'une représentation de graphe du type id => parent_id, je bloque sur une requête. Je cherche à récupérer tous les parent_id d'un noeud en fonction d'une liste.
    Par exemple dans cet exemple minimal :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    id 	| parent_id
    820	|	230
    820	|	636
    900	|	123
    900	|	636
    900	|	849
    1095	|	1093
    1095	|	861
    1095	|	849
    1095	|	636


    je cherche à récupérer tous les parents des noeuds qui ont pour parent 636 ET 849 ce qui devrait sortir :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    id 	| parent_id
    900	|	123
    900	|	636
    900	|	849
    1095	|	1093
    1095	|	861
    1095	|	849
    1095	|	636


    je génère le premiers set de résultats avec une auto-jointure :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    SELECT autoJoin.* FROM table LEFT OUTER JOIN table autoJoin ON table.id = autoJoin.id WHERE table.parent_id IN(636, 849)


    mais bloque complètement pour la suite, à savoir contraindre sur plusieurs lignes. J'ai cherché du côté de HAVING mais sans succès. Est-ce que c'est possible en une seule requête ?
    Je pensais à un truc du style :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT parent_id FROM table
    WHERE table.id
    IN(SELECT autoJoin.parent_id FROM table LEFT OUTER JOIN table autoJoin ON table.id = autoJoin.id WHERE table.parent_id IN(636, 849))
    HAVING...


    mais bloque donc sur la contrainte multi-rows.
    En vous remerciant par avance pour l'aide.
    Vive les roues en pierre

  2. #2
    Expert éminent sénior
    Bonsoir,

    Une solution possible :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select t1.id
         , t1.parent_id
    from ma_table t1
    where exists
         (select 1
          from ma_table t2
          where t2.id=t1.id
            and t2.parent_id=636)
      and exists
         (select 1
          from ma_table t2
          where t2.id=t1.id
            and t2.parent_id=849)

  3. #3
    Membre émérite
    Merci beaucoup, la solution fonctionne
    Vive les roues en pierre