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

  1. #1
    Membre à l'essai
    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
    Points : 17
    Points
    17
    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 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    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 à l'essai
    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
    Points : 17
    Points
    17
    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 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    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 éclairé 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 : 49
    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
    Points : 807
    Points
    807
    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 à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Yep je m'en suis rendu compte

    Bon ça à l'air de marcher nickel

    Merci pour votre aide,

  7. #7
    Membre éclairé 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 : 49
    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
    Points : 807
    Points
    807
    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 à l'essai
    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
    Points : 17
    Points
    17
    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)

  9. #9
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Bah, si l'ordre doit être défini arbitrairement, il faut bien le faire quelque part...
    La question est la suivante : cet ordre ne peut-il être déduit à partir d'autres données, éventuellement dans d'autres tables ?

    Sinon, tu peux imaginer te créer une table tamporaire où tu définis cet ordre, puis faire la jointure pour trier.

    Où alors, ce qui revient finalement au même, définir cette relation dans une expression de table. Par exemple, sous Oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH tmp AS (
    SELECT 1 as pos, 1 as tab_id UNION ALL
    SELECT 2 as pos, 2 as tab_id UNION ALL
    SELECT 3 as pos, 52 as tab_id UNION ALL
    SELECT 12 as pos, 4 as tab_id UNION ALL
    SELECT 5 as pos, 5 as tab_id UNION ALL
    ...)
    SELECT t.*
    FROM table1 t JOIN tmp
      ON t.id_tab = tmp.tab_id
    ORDER BY tmp.pos

  10. #10
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Non l'ordre ne dépend pas d'autres données

    Les valeurs renseignées dans le "in" sont des paramètres d'une méthode java (qui créé la requête avec ces paramètres).
    C'est pour ça qu'une de mes possibilités était de re-trier la liste des résultats (vu que j'ai "l'ordre" en paramètres de ma méthode)

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, 03h49
  2. tri automatique sur un datagridview
    Par hawax dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/06/2007, 22h36
  3. [débutant] Tri dans requete
    Par sumtech dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 27/02/2007, 14h49
  4. Tri automatique des mails
    Par trois_1 dans le forum Réseau
    Réponses: 7
    Dernier message: 03/08/2006, 22h53
  5. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 11h19

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