[Oracle] Entites maître/détail, je bloque !

Entites maître/détail, je bloque ! [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 02-03-2012 à 18:23:30    

Bonjour,
 
Je cherche à faire une requête qui m'échappe un peu il faut bien l'avouer.  :D  
 
Pour faire simple, j'ai une table d'entités maître/détail de ce genre :
 

ID / SUBID
1     A
1     B
1     C
1     D
2     E
2     F


 
Et j'ai aussi construit une (sous) requête qui est en mesure de me retourner une liste de toutes les entités détail ayant une certaine caractéristique : Disons qu'elle contient les valeurs A, B, E et F.
 

GOOD_SUBID
A
B
E
F


 
Je cherche à ne retourner que les entités "Maître" dont TOUTES les entités détail sont présentes dans ma liste.
Dans le cas présent, il faudrait que le résultat soit "2", car le "1" n'est pas éligible. (C et D étant manquants).
 
Comment qu'on fait ?   :sweat:  
Bon en PL/SQL je m'en sortirais je pense, mais là il faut que je sorte ça avec du SQL standard et je n'y arrive pas. Je suis une merde.


Message édité par sateeva le 02-03-2012 à 18:31:23
Reply

Marsh Posté le 02-03-2012 à 18:23:30   

Reply

Marsh Posté le 05-03-2012 à 09:53:37    

personne ? :(

Reply

Marsh Posté le 05-03-2012 à 22:55:43    

Une idée comme ça :
- on fait une jointure qui compte, pour chaque id, le nombre de subid qui nous intéressent et qui y sont liés
- on ne tarde que les id dont le nombre correspond au nombre des subid qui nous intéressent
 [:figti]  
 

SELECT id
FROM (SELECT md.id, count(1) nb
      FROM md
      WHERE subid IN ( SELECT good_subid ... ) -- requete qui liste les subid qui nous interessent
      GROUP BY md.id
     )
WHERE nb=(SELECT count(1) ...) -- requete qui compte les subid qui nous interessent


md : table maitre/detail
 
Du coup, on recherche 2 fois les subid
- pour en avoir la liste
- pour en avoir le nombre

Message cité 1 fois
Message édité par mrbebert le 05-03-2012 à 22:57:40

---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 08-03-2012 à 18:40:52    

mrbebert a écrit :

Une idée comme ça :
- on fait une jointure qui compte, pour chaque id, le nombre de subid qui nous intéressent et qui y sont liés
- on ne tarde que les id dont le nombre correspond au nombre des subid qui nous intéressent
 [:figti]

 

SELECT id
FROM (SELECT md.id, count(1) nb
      FROM md
      WHERE subid IN ( SELECT good_subid ... ) -- requete qui liste les subid qui nous interessent
      GROUP BY md.id
     )
WHERE nb=(SELECT count(1) ...) -- requete qui compte les subid qui nous interessent


md : table maitre/detail

 

Du coup, on recherche 2 fois les subid
- pour en avoir la liste
- pour en avoir le nombre

 

Merci pour le coup de main :)

 

Du coup j'ai trouvé une autre technique :

 

SELECT id FROM
  (SELECT id,
          CASE WHEN subid IN (SELECT good_subid ...)
                                   THEN 1       ELSE 0
                      END flag
  FROM tab)
GROUP BY id
HAVING MIN(flag) = 1;

 

Cela a le mérite de n’accéder qu’une fois à la table.


Message édité par sateeva le 08-03-2012 à 18:41:57
Reply

Sujets relatifs:

Leave a Replay

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