Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 23/11/2010, 10h26   #1
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Par défaut problème d'order by

Bonjour,

j'ai une appli qui liste des remises. La requète qui me permet de retourner la liste contient un tri en descendant sur une date de règlement et un numéro de remise :
Code :
1
2
3
4
5
6
7
8
SELECT NUMREM, DATREG                     
         FROM TABLE               
         WHERE NUMPRS    = :w-numprs 
           AND ......     
           AND DATREG    <= :w-repdatreg  
           AND NUMREM    < :w-repnumrem     
         ORDER BY DATREG DESC, NUMREM DESC
FETCH FIRST 15 ROWS ONLY
Les prédicats datreg et numrem servent à se repositionner pour la pagination.
Les problèmes suivants se posent : on peut avoir deux remises i telles que datregi < datregj et numremi> numremj.

La requète telle qu'elle ne va donc pas m'afficher ces remises là.
Et si j'enlève le prédicat numrem, je ne me repositionne pas correctement.

Quelqu'un aurait il leu une expérience similaire et pourrai me donner une idée pour m'en sortir?

Merci d'avance!
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 10h56   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 625
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 625
Points : 2 608
Points : 2 608
Bonjour,

Pourriez-vous joindre un jeu de test sommaire, explicitant votre problème actuel + le résulta attendu ?

Et préciser le sgbd par la même occasion.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 11h23   #3
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Merci pour ta réponse.

Supposons que l'on ait deux pages 1 et 2 et que la date de reprise pour aller en page 2 est 30/05/2008 et le numéro de reprise est 1600. Le numéro et la date de reprise correspondent à la 15eme remise (la dernière retournée par la requète)
Lorsque je pagine, je réeffectue la requète. L'objectif étant de repositionner le curseur sur la 16eme remise.

Deux cas de figure peuvent se présenter :

cas 1: Si la remise suivante a pour date 30/05/2008 et comme numéro 1550, le prédicat numrem < 1600 me permet de bien me positionner.

cas 2: Si la remise suivante a pour date 30/04/2008 et comme numéro 1650, le prédicat numrem < 1600 ne me permettra pas de bien me positionner.

Le SGBD est DB2.

As tu besoin d'autres explications?
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 11h33   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 625
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 625
Points : 2 608
Points : 2 608
Ok j'ai compris, un peu long ce matin.

Mais votre problème est indépendant de sql.

la couche applicative ne peut-elle pas gérer nativement ce genre de cas ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 11h56   #5
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 071
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 071
Points : 1 856
Points : 1 856
Bonjour,
Pour moi le critère n'est pas bon. Tu dois plutôt chercher les enregistrements qui ont (la même date et un numéro inférieur) OU (une date inférieur) à ta "pagination".

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 12h14   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 932
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 932
Points : 17 736
Points : 17 736
En fait vous êtes dans un problème de ROW VALUE CONSTRUCTOR. Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/sqlaz/select/#L8

Merci de respectez la charte de postage en donnant le DDL de vos tables et un jeu d'essais sous forme INSERT.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 12h16   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 944
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 944
Points : 18 137
Points : 18 137
Envoyer un message via MSN à CinePhil
Je doute aussi de la pertinence du processus.
Si j'ai bien compris, une requête te donne une liste de données trop longue pour être affichée en une seule page et tu ré-exécute la requête à chaque page. Si entre temps de nouvelles données sont arrivées, ta liste est perturbée.

Il faut que le logiciel récupère l'ensemble des données à afficher à un instant T et gère l'affichage par page sans ré-interroger la BDD.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h02   #8
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Citation:
Envoyé par punkoff Voir le message
Ok j'ai compris, un peu long ce matin.

Mais votre problème est indépendant de sql.

la couche applicative ne peut-elle pas gérer nativement ce genre de cas ?
J'y ai pensé ce matin mais on peut avoir un nombre trés élevé de remises par critère de selection (jusque 10200 d'après un spufi(requète lancé en prod) ).
Je crains que la pagination soit alors gourmande en nombre d'ordre sql, puiqu' il faut que j'ouvre mon curseur et que je fetch jusqu'à me positionner correctement.
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h08   #9
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Citation:
Envoyé par CinePhil Voir le message
Je doute aussi de la pertinence du processus.
Si j'ai bien compris, une requête te donne une liste de données trop longue pour être affichée en une seule page et tu ré-exécute la requête à chaque page. Si entre temps de nouvelles données sont arrivées, ta liste est perturbée.

Il faut que le logiciel récupère l'ensemble des données à afficher à un instant T et gère l'affichage par page sans ré-interroger la BDD.
En effet mais le problème ne se pose pas puisque cette table n'est pas alimentée en TP mais qu'une fois tous les soirs.
De plus, la requète sans restreindre aux 15 premiers éléments pourrait etre trés longue et donc entrainer un U240 (Timout).
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h13   #10
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Citation:
Envoyé par tatayo Voir le message
Bonjour,
Pour moi le critère n'est pas bon. Tu dois plutôt chercher les enregistrements qui ont (la même date et un numéro inférieur) OU (une date inférieur) à ta "pagination".

Tatayo.
Non ça ne marchera pas ainsi car, et je reprends l'exemple plus haut, supposons que la dernière remise de la première page ait comme date 30/05/2008 et comme numéro 1600.

Et supposons qu'on ait un enregistrement de la première page qui ait comme date 30/06/2008 et comme numéro 1502.L'un des deux critères étant vérifié pour la remise, la requète positionnera alors mon curseur dessus!
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h15   #11
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Citation:
Envoyé par SQLpro Voir le message
En fait vous êtes dans un problème de ROW VALUE CONSTRUCTOR. Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/sqlaz/select/#L8

Merci de respectez la charte de postage en donnant le DDL de vos tables et un jeu d'essais sous forme INSERT.

A +
Merci pour l'article! je vais le lire tranquillement cette après midi.
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h31   #12
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Citation:
Envoyé par SQLpro Voir le message
En fait vous êtes dans un problème de ROW VALUE CONSTRUCTOR. Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/sqlaz/select/#L8

Merci de respectez la charte de postage en donnant le DDL de vos tables et un jeu d'essais sous forme INSERT.

A +

Magnifique!!! C'est pile poil mon problème.

Merci à tous pour vos réponses!!!
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 15h11   #13
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 071
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 071
Points : 1 856
Points : 1 856
Citation:
Envoyé par michael08 Voir le message
Non ça ne marchera pas ainsi car, et je reprends l'exemple plus haut, supposons que la dernière remise de la première page ait comme date 30/05/2008 et comme numéro 1600.

Et supposons qu'on ait un enregistrement de la première page qui ait comme date 30/06/2008 et comme numéro 1502.L'un des deux critères étant vérifié pour la remise, la requète positionnera alors mon curseur dessus!
Non, l'enregistrement en question ne valide pas le critère. Si je reprends ton exemple:
La dernière ligne de la première page a pour date le 30/05/2008 et numéro 1600
La ligne en exemple a pour date 30/06/2005 et numéro 1502.

Si tu récupère les lignes dont (la même date et un numéro inférieur) OU (une date inférieur), donc (la date = 30/05/2008 et numero < 1600) ou(date < 30/05/2008) la ligne qui a pour date le 30/06/2008 et numéro 1502 ne sort pas, car la date est supérieure à celle de la dernière ligne de la première page. Aucun des deux critères n'est vérifié.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 16h37   #14
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Citation:
Envoyé par tatayo Voir le message
Non, l'enregistrement en question ne valide pas le critère. Si je reprends ton exemple:
La dernière ligne de la première page a pour date le 30/05/2008 et numéro 1600
La ligne en exemple a pour date 30/06/2005 et numéro 1502.

Si tu récupère les lignes dont (la même date et un numéro inférieur) OU (une date inférieur), donc (la date = 30/05/2008 et numero < 1600) ou(date < 30/05/2008) la ligne qui a pour date le 30/06/2008 et numéro 1502 ne sort pas, car la date est supérieure à celle de la dernière ligne de la première page. Aucun des deux critères n'est vérifié.

Tatayo.
Oui. j'avais mal compris. Je pensais que tu voulais que je remplace simplement le AND par un OR.

C'est effectivement ce que j'ai fait. Et du coup je résoud deux problèmes d'un coup : le premier digit du numéro de remise correspond à l'année. Quand on est en 2010, le premier digit est 0. La première requète n'affichait pas les remises de l'année 2010 avant ceux de 2009 (premier digit à 9).

Avec ce petit changement, c'ets la date qui est pris en compte en priorité, donc j'aurais mes remises de 2010 en priorité!
michael08 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 05h47.


 
 
 
 
Partenaires

Hébergement Web