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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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