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
Cette requête retourne 932 lignes sous sql_server.
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')));
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 :
Le souci, c'est que je n'ai en retour que 20 lignes !!
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);
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
Partager