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

Langage SQL Discussion :

problème d'order by


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    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?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 988
    Points
    12 988
    Par défaut
    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.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    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 +

  7. #7
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    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.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    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.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    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).

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    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!

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    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.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    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!!!

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 988
    Points
    12 988
    Par défaut
    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.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    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é!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] problème avec ORDER BY _ DESC avec des flottants
    Par Hayabusa dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/08/2006, 01h00
  2. problème avec order by et union
    Par ghostdog dans le forum Langage SQL
    Réponses: 8
    Dernier message: 23/05/2006, 10h54
  3. [XSD] Problème d'order sur des noeuds dans un schema
    Par jesus144 dans le forum Valider
    Réponses: 2
    Dernier message: 13/04/2006, 16h59
  4. Petit problème de "ORDER BY"
    Par beegees dans le forum Access
    Réponses: 9
    Dernier message: 14/06/2005, 10h38
  5. Problème de Order by dans une requête
    Par showa dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/08/2004, 16h40

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