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 :

Tri automatique requete ?


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut Tri automatique requete ?
    Bonjour,

    J'ai un petit soucis avec une requete sql :

    j'effectue un select * from table1 where id_tab in (1, 2, 52, 12, 5)

    Le soucis est que les résultats sont correctes, mais trié par id_tab (qui est clé primaire)
    Hors je voudrais garder l'ordre, c'est à dire qu'au lieu de récupérer les lignes :
    1
    2
    5
    12
    52

    Je veux récupérer les lignes dans l'ordre des id_tab donnés (1, 2, 52, 12, 5) (je suppose qu'il trie automatiquement les resultats suivant id_tab)

    Voilà, je sais pas si c'est possible

    Merci de vos réponses

  2. #2
    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,

    Attention sans clause ORDER BY un tri n'est pas garanti!

    Certes la recherche sur la PK, donne souvent l'impression que le résultat est trié,
    mais à tout moment l'ordre de restitution peut être modifié.

    Dans ton cas tu cherches à obtenir un ordre factice,
    je te propose cette requête qui n'est pas propre du tout car elle ne fonctionne que dans le cas ou IN est renseigné en dur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select t.*, 
           case when id_tab=1 then 1,
                when id_tab=2 then 2, 
                when id_tab=52 then 3,
                when id_tab=12 then 4,
                when id_tab=5 then 5
           end as seq
    from table1 t
    where id_tab in (1, 2, 52, 12, 5)
    order by seq

    Si les id proviennent d'une sous requête, il faudra trouver autre chose.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    Ok merci

    Je teste ça (je vais voir si on perd pas en temps d'execution)

  4. #4
    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
    Oups, en fait case ça s'écrit plutôt comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t.*, 
           case id_tab 
                when 1 then 1
                when 2 then 2 
                when 52 then 3
                when 12 then 4
                when 5 then 5
           end AS seq
    FROM table1 t
    WHERE id_tab IN (1, 2, 52, 12, 5)
    ORDER BY seq
    [EDIT] : j'ai retirer les virgules, merci Z3phur

  5. #5
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    skuatamad ta première écriture du case était presque bonne, il fallait juste enlever les ',' en fin de ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t.*, 
           (case 
                when id_tab=1 then 1
                when id_tab=2 then 2
                when id_tab=52 then 3
                when id_tab=12 then 4
                when id_tab=5 then 5
           end) AS seq
    FROM table1 t
    WHERE id_tab IN (1, 2, 52, 12, 5)
    ORDER BY seq

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    Yep je m'en suis rendu compte

    Bon ça à l'air de marcher nickel

    Merci pour votre aide,

  7. #7
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Imaginons que dans ton in tu as une requête qui ramène un nombre important de lignes, comment laisser le tri car tu ne peux pas t'amuser à faire des case when un nombre de fois illimité?

    serons-nous donc obligé de faire cela par proc plsql?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    Euh.... je sais pas

    Moi ce que je sais c'est que pour l'instant les deux solutions qui se présentent à moi c'est celle proposée au dessus, ou alors re-trier les resultats en java après la requête

    Donc c'est vrai que dans les deux cas, si on a un nombre important de resultats ça va poser des problèmes...

    Après je peux pas donner de réponses , je ne maitrise pas beaucoup sql (juste ce qu'il faut savoir)

Discussions similaires

  1. Extraire les résultats d'un tri automatique
    Par billou06 dans le forum Excel
    Réponses: 5
    Dernier message: 28/06/2007, 02h49
  2. tri automatique sur un datagridview
    Par hawax dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/06/2007, 21h36
  3. [débutant] Tri dans requete
    Par sumtech dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 27/02/2007, 13h49
  4. Tri automatique des mails
    Par trois_1 dans le forum Réseau
    Réponses: 7
    Dernier message: 03/08/2006, 21h53
  5. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 10h19

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