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

Requêtes PostgreSQL Discussion :

Problème de requête utilisant ROWNUM


Sujet :

Requêtes PostgreSQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2023
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème de requête utilisant ROWNUM
    Bonjour,

    Je suis assez débutant en requête SQL et j'aurais bien besoin de votre aide.
    J'ai une requête assez simple pour extraire des informations d'une de mes tables et j'utilise ROWNUM afin de limiter le nombre de lignes dans mon résultat.

    Ce qui est étrange c'est que :
    - Quand je lance ma requête avec "Where "ROWNUM" between 1 and 100" : La requête me renvoie 72 lignes
    - Quand je lance exactement la même requête en retirant le "Where "ROWNUM" between 1 and 100" : La requête me renvoie 86 lignes.

    Je ne comprends pas du tout pourquoi je n'ai pas 86 lignes à chaque fois.
    Merci d'avance pour votre aide.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select "ETABLISSEMENT", "DATE_COMPTABLE", "D_MOIS", "D_CACLE", "LIBELLE_CA", "D_TCODE", "LIBELLE_TCODE", "D_NATURE_CHARGES", SUM("SOLDE")  
    from (
        select "D_PHASE_ANNEE", "ETABLISSEMENT", "DATE_COMPTABLE", "D_MOIS", "D_CACLE", "LIBELLE_CA", "D_TCODE", "LIBELLE_TCODE", "D_NATURE_CHARGES", "SOLDE", ROW_NUMBER () OVER () "ROWNUM" 
        from "REEL"."TABLE1"   	
        where 	"D_CACLE" like '260XXX'  	 			
        and "D_PHASE_ANNEE" like 'Réalisé 2023' 	 			
        and TO_NUMBER(substr("D_MOIS", 2, 2), 'S0000000D00') between 1 and 12 	
        and "D_NATURE_CHARGES" like 'PP11'
    ) x 
    WHERE "ROWNUM" between 1 and 1000
    GROUP BY "D_PHASE_ANNEE", "ETABLISSEMENT", "DATE_COMPTABLE", "D_MOIS", "D_CACLE", "LIBELLE_CA", "D_TCODE", "LIBELLE_TCODE", "D_NATURE_CHARGES" 
    ORDER BY "D_MOIS" DESC

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Le GROUP BY intervient après le WHERE.
    Il est donc possible (plutôt probable ici) que sans la limite, la requête renvoie plus de "combinaisons" possible pour les colonnes utilisées dans la clause GROUP BY.

    Oui, mon explication n'est pas très claire, mais tu peux voir la différence en utilisant un EXCEPT:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT ... ici la requête sans le filtre sur le ROWNUM et sans le GROUP BY
    EXCEPT
    select ... ici la même, mais avec le filtre en question, et toujours sans le GROUP BY

    Tu verras ainsi facilement d'où vient la différence.

    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2023
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour Tatayo,

    Tout d'abord merci beaucoup pour ta réponse.
    Je pense avoir compris ton explication mais il reste quelque chose que je ne comprends pas.

    J'ai fixé ma limite à 100 lignes.
    La requête avec le group by me renvoie 74 lignes.
    La requête sans le group by me renvoie 84 lignes.

    Les deux requêtes ne sont donc pas tronquées par ma limite, donc limite ou pas, pour moi je devrais avoir le même nombre de ligne (je ne sais pas si je suis claire )

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Parce que, comme l'explique tatayo, la clause WHERE s'applique sur toutes les lignes issues de la sous-requête dans laquelle ROWNUM est calculée, puis les groupes du GROUP BY sont formés à partir de ce résultat intermédiaire.
    Donc, quand on enlève le WHERE, il y a plus de lignes issues de la sous-requête, et donc au final plus de groupes (certains groupes ont "sauté" à cause du WHERE).

    Mais je me demande surtout si ce que vous cherchez à faire, ce n'est pas plutôt par l'utilisation de la clause LIMIT...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2023
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci encore pour votre aide.

    Je viens de comprendre ! Désolé je suis un peu long à la détente. Je comprends enfin ce que vous m'expliquez tous les deux sur l'utilisation du WHERE avant le GROUP BY.
    Et en effet j'ai contourné le problème en utilisant LIMIT car en réalité ce que je souhaite c'est avoir pas plus de 100 lignes dans mon résultat final.
    Ça m'a aussi permis aussi de supprimer ma table dérivée et donc simplifier ma requête.

    Un grand merci à tous les deux pour votre aide.
    Très bonne journée,
    Nicolas

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

Discussions similaires

  1. [AC-2003] Problème de requête sous access en utilisant les dates
    Par rana dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/03/2010, 10h44
  2. problème de requête avec utilisation de min/group by
    Par htristra dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 02/10/2007, 13h16
  3. [SQL] Problème de requête sql utilisant LIKE
    Par yakup.67 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 13h31
  4. Problème de requête rownum
    Par elsodiop dans le forum DB2
    Réponses: 3
    Dernier message: 01/12/2006, 15h21
  5. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18

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