Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/12/2012, 12h42   #1
roukgreg
Futur Membre du Club
 
Inscription : juin 2009
Messages : 84
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : juin 2009
Messages : 84
Points : 18
Points : 18
Par défaut Requête avec rownum

Bonjour,

J'ai dans ma table des champs qui concernce un même objet mais avec des dates différentes. En faites j'aimerais récupérer la ligne avec la date la plus proche. Je sais que y a déjà des questions comme celle-ci qui ont déjà été posées mais je n'ai pas réussi à faire ma requête avec les différentes réponses que j'ai vu.

En faite ma requête me renvoi toujours la même date avec cette requête:
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT mat.num_parc, type_interne_materiel, nom_marque, serie_materiel, statut_mouvement, prix_achat_materiel, statut_materiel, nom_client, date_debut_mouvement, date_fin_mouvement
FROM Materiel mat
INNER JOIN Marque mar
ON mat.num_marque = mar.num_marque
LEFT JOIN Mouvement mou
ON mat.num_parc = mou.num_parc
LEFT JOIN Client cli
ON mou.num_client = cli.num_client
WHERE serie_materiel = 354154
AND rownum <= 1
ORDER BY date_debut_mouvement DESC;
Pour moi je pense que le rownum doit être fait aprés la ORDER BY, donc j'ai essayé avec une sous-requête comme ceci:
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT mat.num_parc, type_interne_materiel, nom_marque, serie_materiel, statut_mouvement, prix_achat_materiel, statut_materiel, nom_client, date_debut_mouvement, date_fin_mouvement
FROM Materiel mat
INNER JOIN Marque mar
ON mat.num_marque = mar.num_marque
LEFT JOIN Mouvement mou
ON mat.num_parc = mou.num_parc
LEFT JOIN Client cli
ON mou.num_client = cli.num_client
WHERE serie_materiel = 354154
AND date_debut_mouvement = (SELECT date_debut_mouvement,rownum FROM mouvement WHERE num_parc = 3 AND rownum <= 1 ORDER BY date_debut_mouvement DESC)
AND rownum <= 1;
Mais la non plus ça ne fonctionna pas.

J'ai même testé la requête :
Code :
SELECT date_debut_mouvement,rownum FROM mouvement WHERE num_parc = 3 rownum <= 2 ORDER BY date_debut_mouvement DESC
mais là il ne me ressort rien du tout, alors que la ligne que je veux à bien le rownum 2.

Auriez vous une idée du souci?

Par avance merci
roukgreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 13h09   #2
skuatamad
Expert Confirmé
 
Inscription : août 2008
Messages : 1 690
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 690
Points : 2 813
Points : 2 813
D'abord on tri dans une sous-requête puis on peut utiliser rownum, sinon on récupère une ligne aléatoire.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT * FROM (
SELECT mat.num_parc, type_interne_materiel, nom_marque, serie_materiel, statut_mouvement, prix_achat_materiel, statut_materiel, nom_client, 
       date_debut_mouvement, date_fin_mouvement
  FROM Materiel mat
 INNER JOIN Marque mar
    ON mat.num_marque = mar.num_marque
  LEFT JOIN Mouvement mou
    ON mat.num_parc = mou.num_parc
  LEFT JOIN Client cli
    ON mou.num_client = cli.num_client
 WHERE serie_materiel = 354154
 ORDER BY date_debut_mouvement DESC
)
WHERE rownum = 1;
Citation:
mais là il ne me ressort rien du tout, alors que la ligne que je veux à bien le rownum 2.
Code :
1
2
3
4
5
6
7
SELECT * FROM (
SELECT date_debut_mouvement,rownum AS rn
  FROM mouvement 
 WHERE num_parc = 3 
 ORDER BY date_debut_mouvement DESC
 )
 WHERE rn = 2
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 14h32   #3
roukgreg
Futur Membre du Club
 
Inscription : juin 2009
Messages : 84
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : juin 2009
Messages : 84
Points : 18
Points : 18
Je te remercie skuatamad. Je me doutais bien qu'il faille ressortir les résultats avant et aprés utiliser le rownum, mais je ne savais pas comment faire.

Je n'avais pas vu encore une requête de ce type:
Code :
SELECT * FROM (SELECT ...)
On en apprends tout les jours

Je te remercie pour ta réponse.
roukgreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h47.


 
 
 
 
Partenaires

Hébergement Web