Bonjour,

j'ai un problème de compréhension sous SQL avec une requête qui ne me retourne pas le bon nombre de résultat en fonction de la requete.
Petite précision, je suis sous Oracle 10.2.
Cette requête s'executait auparavant sous sql_server.

Voici le code de la requête qui retourne le bon nombre de ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
SELECT  
   bsr.nom_site    Nom_du_site,
   bsr.code_site   Code_site,
   bsr.code_nidt   Code_NIDT,
   bsr.sit_sit_key
FROM bde_sim_site_reel  bsr INNER JOIN
     bde_sim_base_dr    bdr ON  bsr.code_dr = bdr.dr_code INNER JOIN
     bde_sim_site_reel_MOD_VAL  mod_val_0 ON mod_val_0.sit_sit_key = bsr.sit_sit_key INNER JOIN 
     bde_sim_site_reel_MOD_VAL  mod_val_1 ON mod_val_1.sit_sit_key=bsr.sit_sit_key INNER JOIN
     bde_sim_site_reel_MOD_VAL  mod_val_4 ON mod_val_4.sit_sit_key=bsr.sit_sit_key
WHERE   mod_val_4.SIT_MOD_KEY=418
AND     mod_val_4.SIT_MOD_OBJ_VAL <> 2443 
AND    (bdr.urm_code = 'PA' )
and bsr.es = '1'
AND mod_val_0.SIT_MOD_KEY=418
AND mod_val_0.SIT_MOD_OBJ_VAL<>'2367'
AND mod_val_0.SIT_MOD_OBJ_VAL<>'1946'
AND mod_val_1.SIT_MOD_KEY=586 
AND mod_val_1.SIT_MOD_OBJ_VAL<>'2011'
AND (NOT EXISTS
       (SELECT  * 
        FROM  bde_sim_site_reel INNER JOIN
              bde_sim_site_reel_MOD_VAL  
                 ON bde_sim_site_reel_MOD_VAL.sit_sit_key = bde_sim_site_reel.sit_sit_key INNER JOIN 
              bde_sim_base_dr   
                 ON  bde_sim_site_reel.code_dr = bde_sim_base_dr.dr_code
        WHERE  bde_sim_site_reel_MOD_VAL.SIT_MOD_KEY=483 
             and   bde_sim_site_reel_MOD_VAL.SIT_MOD_OBJ_VAL = '0' 
             and   bde_sim_base_dr.urm_code='PA'
             and   bde_sim_site_reel.sit_sit_key = bsr.sit_sit_key)
      
      OR (NOT EXISTS
               (SELECT  bde_sim_site_reel.sit_sit_key 
                FROM  bde_sim_site_reel INNER JOIN
                      bde_sim_site_reel_MOD_VAL  
                         ON bde_sim_site_reel_MOD_VAL.sit_sit_key = bde_sim_site_reel.sit_sit_key INNER JOIN 
                      bde_sim_base_dr   
                         ON  bde_sim_site_reel.code_dr = bde_sim_base_dr.dr_code
                WHERE  bde_sim_site_reel_MOD_VAL.SIT_MOD_KEY=534
                 and   bde_sim_site_reel_MOD_VAL.SIT_MOD_OBJ_VAL = '0' 
                 and   bde_sim_base_dr.urm_code='PA')));
Cette requête retourne 932 lignes sous sql_server.
J'ai besoin de la migrer sous Oracle, or Oracle ne digère pas (temps d'execution infini) la combinaison double NOT EXISTS avec un OR en rouge.
Je l'ai donc modifiée :
Voici ce que ça donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
AND NOT EXISTS
       (SELECT  * 
        FROM  bde_sim_site_reel INNER JOIN
              bde_sim_site_reel_MOD_VAL  
                 ON bde_sim_site_reel_MOD_VAL.sit_sit_key = bde_sim_site_reel.sit_sit_key INNER JOIN 
              bde_sim_base_dr   
                 ON  bde_sim_site_reel.code_dr = bde_sim_base_dr.dr_code
        WHERE  (bde_sim_site_reel_MOD_VAL.SIT_MOD_KEY=483 
               or bde_sim_site_reel_MOD_VAL.SIT_MOD_KEY=534)
             and   bde_sim_site_reel_MOD_VAL.SIT_MOD_OBJ_VAL = '0' 
             and   bde_sim_base_dr.urm_code='PA'
             and   bde_sim_site_reel.sit_sit_key = bsr.sit_sit_key);
Le souci, c'est que je n'ai en retour que 20 lignes !!
Je suis conscient qu'il s'agit probablement d'un pb de logique mais il me semble pourtant que les 2 reqêtes sont identiques.
Toute aide sera la bienvenue.
Merci