IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

SQL Oracle Discussion :

Problème Requête SQL


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut Problème Requête SQL
    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

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pourquoi pas simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NOT EXISTS
                   (SELECT  1
                    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 IN (534,384)
                         and   bde_sim_site_reel_MOD_VAL.SIT_MOD_OBJ_VAL = '0' 
                         and   bde_sim_base_dr.urm_code='PA'
                    )
    Les conditions étant les mêmes à la valeurs de SIT_MOD_KEY prêt.

    T'as essayé avec un NOT IN ?

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut
    J'ai fait la modification avec :
    bde_sim_site_reel_MOD_VAL.SIT_MOD_KEY IN (483,534)
    et c'est identique toujours 20 lignes en retour.

    Même avec un NOT IN.

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    La requete principale est bizarre pour le second not exists.
    Elle n'a aucun lien avec la requete principale... T'es sur de toi ?
    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
    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  1 
            FROM  BDE_SIM_SITE_REEL r1
    			INNER JOIN BDE_SIM_SITE_REEL_MOD_VAL v1	ON v1.sit_sit_key = r1.sit_sit_key 
    			INNER JOIN  BDE_SIM_BASE_DR  d1			ON  r1.code_dr = d1.dr_code
            WHERE  v1.sit_mod_key=483 
            AND   v1.sit_mod_obj_val = '0' 
            AND   d1.urm_code='PA'
            AND   r1.sit_sit_key = bsr.sit_sit_key
    		)
         OR 
    	NOT EXISTS
          (SELECT  1 
          FROM  BDE_SIM_SITE_REEL r2
    			INNER JOIN BDE_SIM_SITE_REEL_MOD_VAL v2 ON v2.sit_sit_key = r2.sit_sit_key 
    			INNER JOIN BDE_SIM_BASE_DR d2 ON  r2.code_dr = d2.dr_code
           WHERE  v2.sit_mod_key = 534
            AND   v2.sit_mod_obj_val = '0' 
            AND   d2.urm_code = 'PA'
    		)
    	)
    Evite aussi les cast automatiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mod_val_4.sit_mod_obj_val <> 2443 
    AND mod_val_0.sit_mod_obj_val <> '2367'

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Quelle relation y a-t-il entre BDE_SIM_SITE_REEL et BDE_SIM_SITE_REEL_MOD_VAL ?

    Edit : En fait non, inutile, je pensais optimiser mais c'est pas possible dans ce sens.

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    n'y aurait-il pas des cas où sit_sit_key peut être NULL ?

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    et il ne manque pas une jointure avec bsr.sit_sit_key dans le 1° NOT EXISTS ?

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    optimisation possible :
    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
    (NOT EXISTS
           (SELECT  1 
            FROM  	BDE_SIM_SITE_REEL_MOD_VAL v1
    	WHERE v1.sit_sit_key 	= bsr.sit_sit_key 
    	AND  v1.sit_mod_key 	IN (483, 534)
            AND  v1.sit_mod_obj_val = '0' 
            )
    OR
    NOT EXISTS
           (SELECT  1 
            FROM  	BDE_SIM_SITE_REEL bsr1,
    		BDE_SIM_BASE_DR  d1			
    	WHERE bsr1.code_dr 		= d1.dr_code
            AND  d1.urm_code 	= 'PA'
            AND  bsr1.sit_sit_key 	= bsr.sit_sit_key
    		)

  9. #9
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par orafrance Voir le message
    et il ne manque pas une jointure avec bsr.sit_sit_key dans le 1° NOT EXISTS ?
    Non c'est le second not exists. c'est ce que j'ai dit dans mon premier post.
    J'opte pour une erreur de recopie sinon la requete ramènerait encore moins d'enregistrements.

  10. #10
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut
    Il n'y a pas de null dans les 2 tables bde_sim_site_reel (cle primaire),
    n'y dans bde_sim_site_reel_mod_val .

    Je m'aperçois par contre qu'il n'y a pas d'index dans cette dernière table.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requête SQL
    Par mandaillou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/10/2005, 11h37
  2. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  3. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  4. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo