Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/01/2007, 18h19   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 4
Points : 1
Points : 1
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 :
Citation:
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...)
laurentl62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2007, 19h11   #2
Membre éclairé
 
Inscription : 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
Points : 367
Points : 367
mon avis est que tu dois avoir ( entre autres ) des pbs de conversion ...

1. rempacer :
Code :
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 :
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.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2007, 20h02   #3
Invité de passage
 
Inscription : janvier 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 4
Points : 1
Points : 1
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
laurentl62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2007, 21h20   #4
Membre éclairé
 
Inscription : 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
Points : 367
Points : 367
pour le point 1, il faut lire :

remplacer :
Code :
C.SOCCLE = 'REX' AND C.CODLAN = 'FR' AND A.IDCY00 = 'REX'
par:
Code :
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 :
TO_CHAR(A.DATSOR,'YYYY-MM-DD') < '2006-05-01'
par:
Code :
A.DATSOR < TO_DATE('2006-05-01','RRRR-MM-DD')
et ...
Code :
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 :
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.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2007, 23h28   #5
Invité de passage
 
Inscription : janvier 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 4
Points : 1
Points : 1
Taska,

j'ai fait la manip préconisée avec la date pour laquelle cela fonctionne :
Code :
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 :
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
laurentl62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2007, 08h29   #6
Rédacteur
 
Inscription : septembre 2004
Messages : 626
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 626
Points : 622
Points : 622
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...)
lalystar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2007, 11h51   #7
Invité de passage
 
Inscription : janvier 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 4
Points : 1
Points : 1
Il y avait en effet des incohérences dans le contenu des tables.
Mon problème est résolu.
demeure la requête qui renvoie un nombre différents de lignes selon le formatage des dates.
Le principal est que mon souci initial soit résolu.

Merci à tous.
laurentl62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h07.


 
 
 
 
Partenaires

Hébergement Web