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 :

[transact SQL] problème d'ORDER BY


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut [transact SQL] problème d'ORDER BY
    salut les gens,

    je travaille sur un projet c# ou j'exploite le résultat de plusieurs DataReader issues de requêtes de type SELECT.
    Voila celle qui me pose un problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string requete = select id, num, ref, date from client, entete where ref=CLI_CODCLI and TYPMVT='FA' and datediff(Month, date, getdate())<36 and not exists ( select id from factures where piece=ANUMPIEC) order by date desc
    AVANT de dérouler de le DataReader, j'ai besoin de connaitre le nombre de lignes qu'il contient, donc j'effectue systématiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from ( requète ) as tmp
    le count(*) me génère une erreur sur la requète écrite plus haut:

    "La clause ORDER BY n'est pas valide dans les vues, les fonctions Inline, les tables dérivées et les sous-requêtes, sauf si TOP est également spécifié."

    je ne sais pas comment résoudre ce problème, sachant que mon principe de fonctionnement:
    1- j'écris la requète
    2- je fait un count(*) avec la requète dans le from
    3- je crée un DataReader avec la requète initale

    doit impérativement resté inchangé.

    en vous remerciant par avance.

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Par défaut
    Bonjour,

    Comment tu arrives à lier tes tables ?

    Je connais pas le C# mais la Clause ORDER BY sert à ordonner des groupes et s'applique après le regroupement ou en effet avec un TOP voir sans tout cela d'ailleur un DISTINCT peut parfois être suffisant. Elle doit contenir les colonnes de la Clause SELECT sauf les colonnes agrégées...

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    Euh la c'est moi qui est peut être pas bien compris ta question ^^

    je vais tacher de schématiser un peu, mon exemple de requète n'était pas très clair de toute façon

    normalement, ce genre de requète fonctionne sans aucun problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maRequete = select t1.id, t1.nom, t2.date from t1, t2 where t1.id=t2.id order by t2.date desc
    (arrète moi si je me trompe )

    j'ai besoin de cette requète pour 2 choses:

    créer un DataReader:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reader = command.CreateReader(maRequete)
    connaitre le nombre d'enregistrements de cette requète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int countRows = command.Execute("select count(*) from (" + maRequete + ") as tmp")
    la problèmatique étant que cette dernière ligne plante (msg de mon premier post) et que je ne peux toucher au code des 2 dernières lignes, mais seulement de la requète initiale...

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Par défaut
    Et oui le ORDER BY et la dernière clause...
    Comme présenté ici, tu place donc ta clause sous forme de table dérivée, et ce n'est pas possible...
    Il faudrais que ce soit présenté ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int countRows = command.Execute("SELECT 
                                            count(*) 
                                                     FROM 
                                                            (SELECT t1.id
                                                                      , t1.nom
                                                                      , t2.date 
                                                              FROM t1
                                                                     , t2 
                                                              WHERE t1.id=t2.id
                                                               )as tmp"
                                                               /* Là tu place une clause ORDER BY)
    Après le soucis et d'essayer par un DISTINCT dans la table dérivée !
    Avec un peu de chance !!!

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut,

    Effectivement, tu ne peux pas faire un count sur des données triées.
    Dans ton cas de figure, le plus simple est de créer une variable contenant le ORDER BY,
    que tu concatène pour créer la requete finale et pas pour le count.

    Sinon, je ne sais pas pourquoi tu as besoin de récupérer le nombre de lignes retournées,
    mais si tu peux te permettre de le récupérer en même temps que les données,
    une idée serait de regarder du côté des fonctions analytiques (sans mettre de clause PARTITION BY, pour obtenir la totalité des enregistrments)
    Ca éviterait de passer 2 requêtes au serveur.
    C'est un lien oracle mais je pense que ça fonctionne de la même manière sur SQLSERVER.
    En tout cas l'astuce du count(*) over() fonctionne sous oracle, même si c'est un peu dénaturer le pourquoi des fonctions analytiques.

    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT id, num, ref, date, count(*) over () as nb_total
    FROM client, entete 
    WHERE ref=CLI_CODCLI 
    AND TYPMVT='FA' 
    AND datediff(Month, date, getdate()) < 36 
    AND NOT EXISTS ( SELECT id FROM factures WHERE piece=ANUMPIEC) 
    ORDER BY date DESC
    PS : la sous requête dans le NOT EXISTS n'est pas corrélée à la requête principale, ce qui n'est pas tout à fait normal (même si ça te renvoie le résultat escompté)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Bonjour,

    Je ne comprends pas bien vos explications sur l'histoire du count couplé au order by. Peut être que quelque chose m'echappe.

    Peux tu simplement essayer ta requete en enlevant l'alias de fin?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int countRows = command.Execute("select count(*) from (" + maRequete + ")")

Discussions similaires

  1. Transact-SQL problème CAST Time
    Par stephane.julien dans le forum Développement
    Réponses: 7
    Dernier message: 03/09/2009, 21h18
  2. TRANSACT-SQL Problème d'addition
    Par dsr57 dans le forum Développement
    Réponses: 3
    Dernier message: 03/10/2008, 15h53
  3. [Transact-SQL] Problème avec "execute" dans un "if"
    Par dj_lil dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/12/2007, 15h56
  4. [Transact SQL] Problème recherche
    Par Escrow974 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/09/2007, 14h56
  5. [SQL]Problème avec ADO - Order by
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/11/2005, 10h55

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