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 :

Order by dans une sous requête


Sujet :

SQL Oracle

  1. #1
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut Order by dans une sous requête
    Bonjour à tous,
    j'essaie de traduire une requête fonctionnant en SQLServer en Oracle et j'ai en retour d'erreur :
    ORA-00907: parenthèse de droite absente
    cette erreur est liée à l'order by dans la sous requête, mais le problème c'est que j'en ai besoin...
    ci - dessous la requête en oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT S.noChauffeur, S.dateHeureDebut, S.dateHeureFin, S.activite, S.noSact2, 
    S.noTypeSact2, S.positionChauffeur, S.kmParcourus, GPS.longitude, GPS.latitude, 
    (SELECT C.kmCompteur 
    FROM CHRONOLOGIE C 
    WHERE C.noVehicule=7 AND C.dateheuredebut>=S.dateheureDebut AND C.dateheuredebut<='20080521 213800' 
    AND ROWNUM=1 ORDER BY C.dateheuredebut) as kmCompteur 
    FROM SACT2 S 
    LEFT JOIN GPS_SACT2 G on G.noSact2 = S.noSact2 
    LEFT JOIN GPS on GPS.noGPS = G.noGPS 
    WHERE S.noVehicule=7 
    AND S.dateHeureDebut BETWEEN '20080521 000000' AND '20080521 213800' 
    AND S.dateHeureDebut = G.dateHeureGPS 
    AND G.noGPSSact2=(select min(noGPSSact2) from GPS_SACT2 where noSact2 = S.noSact2) 
    ORDER BY S.dateHeureDebut
    et ici la requête en SQLServer qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT S.noChauffeur, S.dateHeureDebut, S.dateHeureFin, S.activite, S.noSact2, 
    S.noTypeSact2, S.positionChauffeur, S.kmParcourus, GPS.longitude, GPS.latitude, 
    (SELECT TOP 1 C.kmCompteur 
    FROM CHRONOLOGIE C
    WHERE C.noVehicule=514 AND C.dateheuredebut>=S.dateheureDebut AND C.dateheuredebut<='20080403 213800' 
    ORDER BY C.dateheuredebut) as kmCompteur 
    FROM SACT2 S 
    LEFT JOIN GPS_SACT2 G on G.noSact2 = S.noSact2 
    LEFT JOIN GPS on GPS.noGPS = G.noGPS 
    WHERE S.noVehicule=514 
    AND S.dateHeureDebut BETWEEN '20080403 000000' AND '20080403 213800' 
    AND S.dateHeureDebut = G.dateHeureGPS 
    AND G.noGPSSact2=(select min(noGPSSact2) from GPS_SACT2 where noSact2 = S.noSact2) 
    ORDER BY S.dateHeureDebut
    quelqu'un aurait - il une suggestion ou idée ?

    Merci par avance,
    Christophe

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Salut,
    Il faut trier avant d'utiliser rownum :
    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
    SELECT DISTINCT S.noChauffeur,
           S.dateHeureDebut, 
           S.dateHeureFin, 
           S.activite, 
           S.noSact2,
           S.noTypeSact2, 
           S.positionChauffeur, 
           S.kmParcourus, 
           GPS.longitude, 
           GPS.latitude,
           (select kmCompteur
           from (
                SELECT C.kmCompteur
                FROM CHRONOLOGIE C
                WHERE C.noVehicule=7
                AND C.dateheuredebut>=S.dateheureDebut
                AND C.dateheuredebut<='20080521 213800'
                ORDER BY C.dateheuredebut)
           where rownum=1) as kmCompteur
    FROM SACT2 S
    LEFT JOIN GPS_SACT2 G on G.noSact2 = S.noSact2 
    LEFT JOIN GPS on GPS.noGPS = G.noGPS 
    WHERE S.noVehicule=7 
    AND S.dateHeureDebut BETWEEN '20080521 000000' AND '20080521 213800' 
    AND S.dateHeureDebut = G.dateHeureGPS
    AND G.noGPSSact2=(select min(noGPSSact2) from GPS_SACT2 where noSact2 = S.noSact2) 
    ORDER BY S.dateHeureDebut
    Si ta requete doit également fonctionner sous sqlserver, utilise plutôt row_number

  3. #3
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Merci, en effet je n'ai plus le message d'erreur.

    Par contre le kmCompteur est toujours à zéro dans mon résultat.. ?
    alors qu'il devrait être renseigné.

    j'ai le sentiment que le S.dateHeureDebut de la sous requête n'est pas pris en compte ??

  4. #4
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    je rajoute qu'en supprimant l'order by de la sous requête, mes kilométrages sont alimentés correctement !
    mais j'ai pourtant besoin de trier le résultat de cette sous requête...

    Des idées ?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Quel est la valeur de kmcompteur quand C.dateheuredebut=S.dateheureDebut ?
    Ca te le fais pour tous les véhicules ?

    Par contre dans la sous-requête moi je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE C.noVehicule=S.noVehicule /*au lieu de WHERE C.noVehicule=7*/
    et si c.dateheuredebut et s.dateheuredebut sont bien de type date, je convertirais la chaîne de caractères en date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_date('20080521 213800','YYYYMMDD HH24MISS')

  6. #6
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    En fait si je mets ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE C.noVehicule=S.noVehicule /*au lieu de WHERE C.noVehicule=7*/
    j'ai ce message d'erreur :
    ORA-03113: fin de fichier sur canal de communication
    et si c.dateheuredebut et s.dateheuredebut sont bien de type date, je convertirais la chaîne de caractères en date :
    En fait ce ne sont pas des types date, mais du CHAR(15).

    Sinon concernant mon problème sur le kmCompteur à 0, en enlevant le Order by de la sous requête cela fonctionne bien...
    j'ai l'impression que le fait de mettre l'order by, Oracle renvoie les kilométrages en oubliant les critères de date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                AND C.dateheuredebut>=S.dateHeureDebut
                AND C.dateheuredebut<='20080521 213800'
    comme s'il renvoyait le kilométrage du 1er enregistrement de la table chronologie...?

    Aussi j'ai essayé cette requête avec un ROW_NUMBER, j'ai le même souci, mes kilomètres sont à 0....
    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
    SELECT DISTINCT S.noChauffeur,
           S.dateHeureDebut,
           S.dateHeureFin,
           S.activite,
           S.noSact2,
           S.noTypeSact2,
           S.positionChauffeur,
           S.kmParcourus,
           GPS.longitude,
           GPS.latitude,
           (SELECT kmCompteur
           FROM (
                SELECT ROW_NUMBER() OVER (ORDER BY C.dateheuredebut ASC) AS row_number, C.kmCompteur
                FROM CHRONOLOGIE C
                WHERE C.noVehicule=7
                AND C.dateheuredebut>=S.dateheureDebut
                AND C.dateheuredebut<='20080521 213800'
                ) foo
           WHERE foo.row_number=1) AS kmCompteur
    FROM SACT2 S
    LEFT JOIN GPS_SACT2 G ON G.noSact2 = S.noSact2
    LEFT JOIN GPS ON GPS.noGPS = G.noGPS
    WHERE S.noVehicule=7
    AND S.dateHeureDebut BETWEEN '20080521 000000' AND '20080521 213800'
    AND S.dateHeureDebut = G.dateHeureGPS
    AND G.noGPSSact2=(SELECT min(noGPSSact2) FROM GPS_SACT2 WHERE noSact2 = S.noSact2)
    ORDER BY S.dateHeureDebut

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    ORA-03113: fin de fichier sur canal de communication
    Bizarre pourquoi ça le ferais pour le noVehicule et pas pour la dateHeureDebut...

    Par contre j'avais pas tester la sous-requête corrélée dans le select et moi (sur une 9i) ça me renvoie une ORA-00904 : invalid identifier sur l'alias S.

    Je te propose une solution de contournement, passer par une jointure classique (non testée) :

    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
    SELECT DISTINCT S.noChauffeur,
           S.dateHeureDebut,
           S.dateHeureFin,
           S.activite,
           S.noSact2,
           S.noTypeSact2,
           S.positionChauffeur,
           S.kmParcourus,
           GPS.longitude,
           GPS.latitude,
           v.kmCompteur
    FROM SACT2 S
    JOIN (SELECT C.kmCompteur,
                 C.noVehicule,
                 C.dateHeureDebut,
                 ROW_NUMBER() OVER (PARTITION BY C.noVehicule ORDER BY C.dateheuredebut ASC) AS row_number
          FROM CHRONOLOGIE C
          WHERE C.dateheuredebut<='20080521 213800') v ON (S.noVehicule=v.noVehicule AND S.dateHeureDebut<=v.dateHeureDebut AND v.row_number=1)
    LEFT JOIN GPS_SACT2 G ON G.noSact2 = S.noSact2
    LEFT JOIN GPS ON GPS.noGPS = G.noGPS
    WHERE S.noVehicule=7
    AND S.dateHeureDebut BETWEEN '20080521 000000' AND '20080521 213800'
    AND S.dateHeureDebut = G.dateHeureGPS
    AND G.noGPSSact2=(SELECT min(noGPSSact2) FROM GPS_SACT2 WHERE noSact2 = S.noSact2)
    ORDER BY S.dateHeureDebut
    Est ce que ça pourrais convenir ?

    [EDIT] Modification de l'inégalité dans le ON, mais gros doute sur la pertinence de v.row_number=1.

  8. #8
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Cette requête passe bien, mais les km compteur sont toujours à zéro...:
    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
     
    NOCHAUFFEUR	DATEHEUREDEBUT	DATEHEUREFIN	ACTIVITE	NOSACT2	NOTYPESACT2	POSITIONCHAUFFEUR	KMPARCOURUS	LONGITUDE	LATITUDE	KMCOMPTEUR
    1292	20080521 013030	20080521 014824	T	296	5	1	0	-28460	4727130	0
    1292	20080521 014838		T	297	1			-28460	4727130	0
    1292	20080521 065330	20080521 071448	T	298	4	1	0	-54150	4757060	0
    1292	20080521 074044	20080521 075112	T	299	4	1	0	-58190	4750360	0
    1292	20080521 101746	20080521 102118	T	302	6	1	0	-28470	4727140	0
    1292	20080521 102122		T	303	2			-28470	4727140	0
    1292	20080521 102138		T	304	1			-28470	4727140	0
    1292	20080521 102146	20080521 103012	T	305	5	1	0	-28470	4727140	0
    1292	20080521 105328		T	306	4			-23390	4727310	0
    9999	20080521 120618	20080521 121718	T	319	6	1	0	-28440	4727130	0
    1340	20080521 130816	20080521 131424	T	320	5	1	0	-28460	4727130	0
    1340	20080521 144016		T	322	2			-44000	4803350	0
    1340	20080521 144034		T	323	1			-44000	4803350	0
    1340	20080521 202014	20080521 203630	T	407	4	1	0	-28440	4727130	0
    merci de ton aide... j'ai l'impression de n'être pas loin du résultat, mais ce fichu order by dans la sous requête pose problème...

Discussions similaires

  1. Order by dans une sous requête
    Par bstevy dans le forum SQL
    Réponses: 5
    Dernier message: 21/04/2015, 17h07
  2. Order by dans une sous requête
    Par mister3957 dans le forum SQL
    Réponses: 2
    Dernier message: 12/02/2009, 18h12
  3. Passer un paramètre dans une sous-requête
    Par Lucier dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/10/2007, 10h07
  4. Contourner le non-support de limit dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/09/2007, 10h45
  5. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54

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