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

Oracle Discussion :

requête SQL capricieuse


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut requête SQL capricieuse
    Bonjour,

    je rencontre un problème qui me fait m'arracher les cheveux par poignées...

    Je tente d'exécuter ceci :
    SELECT DISTINCT A.NUDOSS, B.MATRIC FROM HR.ZYES A, HR.ZX00 B, HR.ZX6B C
    WHERE C.SOCCLE = 'REX' AND C.CODLAN = 'FR' AND A.IDCY00 = 'REX' AND
    C.PERPAI >= '200605 ' AND C.PERPAI <= '200612 ' AND C.TYPAIE = 'F'
    AND B.NUDOSS = C.NUDOSS AND B.NUGEST = A.NUDOSS AND
    TO_CHAR(A.DATSOR,'YYYY-MM-DD') < '2006-05-01'
    AND
    A.NUDOSS NOT IN (SELECT DISTINCT NUDOSS FROM HR.ZYES WHERE IDCY00 = 'REX' AND
    TO_CHAR(DATENT,'YYYY-MM-DD') <= '2006-12-31' AND
    ( TO_CHAR(DATSOR,'YYYY-MM-DD') = '0001-01-01' OR TO_CHAR(DATSOR,'YYYY-MM-DD')>= '2006-05-01' ) )

    ORDER BY B.MATRIC ;
    Sous SQL*Plus : la requête n'en finit pas : je tente d'exécuter mais aucun résultat même pas un petit no row selected au bout de 20 minutes.... je suis obligé d'interrompre la requête.

    Par contre si j'exécute la première partie j'ai très vite un résultat (5370 lignes)
    idem pour la partie verte (5813).


    Enfin si je remplace 2006-05 par 2006-01 dans toutes les dates, c'est ok au bout de 2 minutes.


    Je n'y comprends rien, est ce que cela vient des données, d'Oracle ???




    D'avance merci pour vos suggestions

    environnement UNIX/oracle 7.3.4 (je sais c'est vieux...)

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    mon avis est que tu dois avoir ( entre autres ) des pbs de conversion ...

    1. rempacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C.SOCCLE = 'REX' AND C.CODLAN = 'FR' AND A.IDCY00 = 'REX'
    ...
    AND TO_CHAR(A.DATSOR,'YYYY-MM-DD') < '2006-05-01'
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C.SOCCLE  = 'REX' AND C.CODLAN = 'FR' AND A.IDCY00 = C.SOCCLE
    ...
    AND A.DATSOR < TO_DATE('2006-05-01','RRRR-MM-DD')
    ( en règle générale, sous HR ACCESS A.NUDOSS = B.NUDOSS ...)


    etc ...

    CDLT.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut
    Bonsoir Taska,

    Merci pour ta réponse.

    Pour le point 1 :
    j'ai déjà essayé sans le TO_CHAR et en mettant la date au format '2006-05-01-00.00.00' comme elle sont stockées dans les
    tables.

    Pour le point 2 :
    Le nudoss des tables ZX n'est pas l'équivalent de celui des ZY. C'est bien le nugest de zx00 qu'il faut "jointoyer" au nudoss de zyes.

    C'est vraiment bizarre comme pb.

    La jointure fonctionne bien , la selection des dossiers à exclure aussi c'est l'assemblage des 2 par le "a.nudoss not in" qui ne va pas .

    Je ne comprends pas ce qui ce passe. D'autant plus que cela a fonctionné il y a 2 semaines. Je me demande s'il ne s'agirait pas plutôt d'un problème technique Oracle.

    Bonne fin de soirée


    Laurentl62

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    pour le point 1, il faut lire :

    remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C.SOCCLE = 'REX' AND C.CODLAN = 'FR' AND A.IDCY00 = 'REX'
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C.SOCCLE  = 'REX' AND C.CODLAN = 'FR' AND A.IDCY00 = C.SOCCLE
    sinon jointure merdik ...

    et puis c'est sur il faut remplacer tout les contrôles de date , style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_CHAR(A.DATSOR,'YYYY-MM-DD') < '2006-05-01'
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A.DATSOR < TO_DATE('2006-05-01','RRRR-MM-DD')
    et ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND
    A.NUDOSS NOT IN (SELECT DISTINCT NUDOSS FROM HR.ZYES WHERE IDCY00 = 'REX' AND
    TO_CHAR(DATENT,'YYYY-MM-DD') <= '2006-12-31' AND
    ( TO_CHAR(DATSOR,'YYYY-MM-DD') = '0001-01-01' OR TO_CHAR(DATSOR,'YYYY-MM-DD')>= '2006-05-01' )
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AND
    not exists (SELECT rowid  FROM HR.ZYES 
    WHERE nudoss = ....
    and  IDCY00 = 'REX' 
    AND DATENT <= to_date ('2006-12-31', 'YYYY-MM-DD') 
    AND ...
    et puis re-écrire ta requette en employant les balises : CODES
    ce qui parraitra un peu + clair ...

    CDLT.

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut
    Taska,

    j'ai fait la manip préconisée avec la date pour laquelle cela fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT DISTINCT A.NUDOSS, B.MATRIC FROM   HR.ZYES A, HR.ZX00 B, HR.ZX6B C  
    WHERE   C.SOCCLE = 'REX' AND   C.CODLAN = 'FR' AND   A.IDCY00 = 'REX' AND   
    C.PERPAI >=  '200601  ' AND   C.PERPAI <=  '200612  ' AND   C.TYPAIE = 'F' 
    AND  B.NUDOSS = C.NUDOSS AND  B.NUGEST = A.NUDOSS AND 
    TO_CHAR(A.DATSOR,'YYYY-MM-DD')  < '2006-01-01' AND
    A.NUDOSS NOT IN (SELECT DISTINCT NUDOSS FROM HR.ZYES WHERE IDCY00 = 'REX' AND 
    TO_CHAR(DATENT,'YYYY-MM-DD') <= '2006-12-31' AND 
    ( (TO_CHAR(DATSOR,'YYYY-MM-DD') = '0001-01-01') OR (TO_CHAR(DATSOR,'YYYY-MM-DD')>= '2006-01-01' ) )  )
    ORDER BY B.MATRIC ;
    Une seule ligne est renvoyée

    et pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT DISTINCT A.NUDOSS, B.MATRIC FROM   HR.ZYES A, HR.ZX00 B, HR.ZX6B C  
    WHERE   C.SOCCLE = 'REX' AND   C.CODLAN = 'FR' AND   A.IDCY00 = c.socdos AND   
    C.PERPAI >=  '200601  ' AND   C.PERPAI <=  '200612  ' AND   C.TYPAIE = 'F' 
    AND  B.NUDOSS = C.NUDOSS AND  B.NUGEST = A.NUDOSS AND 
    A.DATSOR < TO_DATE('2006-01-01','RRRR-MM-DD') AND
    A.NUDOSS NOT IN (SELECT DISTINCT NUDOSS FROM HR.ZYES WHERE IDCY00 = 'REX' AND 
    A.DATENT <= TO_DATE('2006-12-31','RRRR-MM-DD') AND 
    ( (A.DATSOR = TO_DATE('0001-01-01','RRRR-MM-DD')) OR (A.DATSOR >= TO_DATE('2006-01-01','RRRR-MM-DD')) )  )
    ORDER BY B.MATRIC ;
    résultat : 87 lignes

    j'y comprends encore moins que rien

    Point positif, la requête qui "bloquait" ne bloque plus.

    Je vais regarder du côté du contenu des tables du point de vue logique il me semble qu'il y a un schmilblick de ce côté là.

    encore merci

  6. #6
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    Bonjour,


    Je pense que c'est une bonne habitude de préfixer dans "SELECT DISTINCT NUDOSS" par le nom de la table.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

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

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 15h41
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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