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 :

[Access] Tri des données


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 9
    Par défaut [Résolu] [Access] Tri des données
    Bonjour à tous

    J'ai une question sans doute très basique, mais je débute et je n'ai pas trouvé la réponse dans le très bon cours de ce site.
    Voici ma question : imaginons une table MYTAB à 2 colonnes, la première (NOMBRE) contient des nombres de 1 à 10, la seconde (TEXTE) contient du texte "Un", "Deux"... "Dix" dans l'ordre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NOMBRE     TEXTE
    ---------------------
    1               Un
    2               Deux
    3               Trois
    4               Quatre
    ...
    10             Dix

    Je veux une requête pour récupérer le contenu de la colonne TEXTE en fonction de valeurs contenues dans la colonne NOMBRE, sachant que NOMBRE contenir plusieurs valeurs dans un ordre donné (voir exemple). J'arrive à récupérer les bons éléments, mais pas dans le bon ordre, et j'ai l'impression que la commande ORDER BY ne peut pas répondre à mon problème.
    Mon but est d'avoir le résultat en 1 seul requête car je fais cette requête depuis un logiciel de simulation qui dispose de capacités très limitées pour récupérer des données depuis une base de données, et chaque requête est relativement lente, je veux donc limiter au maximum leur nombre. La base de données est de type Oracle.

    Exemple : Je veux récupérer "Deux" "Huit" "Cinq" dans cet ordre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT TEXT FROM MYTAB WHERE NOMBRE IN (2,8,5)
    Le résultat renvoyé est "Deux" "Cinq" "Huit", sans doute parce que ces entrées apparaissent dans cet ordre dans la base. ORDER BY ne semble pas pouvoir être utilisé dans ce cas car il se base sur un ordre établi sur une colonne de la table, or la je veux un classement en fonction de l'ordre dans IN (...).
    Y'a-t il un moyen d'obtenir ça facilement ? avec des sous-requêtes peut-être?

    Merci par avance et toutes mes excuses si la réponse est dans le cours et que je suis passé à côté..

  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,
    A mon avis il faut utiliser une colonne fictive pour créer un ordre par nombre, unir les résultats et enfin les trier selon cet ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TEXT, 1 as ordre FROM MYTAB WHERE NOMBRE = 2
    UNION ALL
    SELECT TEXT, 2 as ordre FROM MYTAB WHERE NOMBRE = 8
    UNION ALL
    SELECT TEXT, 3 as ordre FROM MYTAB WHERE NOMBRE = 5
    order by ordre
    Mais je ne sais pas si cette solution peut te convenir.
    Bon c'est peut être possible de créer la colonne ordre tout en évitant les UNION ALL, mais ça restera peu intuitif.

  3. #3
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    quel SGBD utilises tu?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 9
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    quel SGBD utilises tu?

    La base de données est sous Oracle (je ne connais pas la version précise, c'est le service informatique qui gère ca, mais je peux me renseigner si besoin), le logiciel que j'utilise pour lancer la requête est acslXtreme (un logiciel de simulation dynamique genre Matlab) qui possède une petite fonction pour récupérer des données via une requête SQL (il tourne sous Windows et fait sans doute en appel à des composants de Windows pour gérer ces requêtes mais je n'en sais pas plus).

  5. #5
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    tu peux essayer ceci peut etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by field(nombre,2,8,5)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 9
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    tu peux essayer ceci peut etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by field(nombre,2,8,5)
    Je vais essayer ca aussi.
    Merci pour votre aide.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 9
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    tu peux essayer ceci peut etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by field(nombre,2,8,5)
    Après lecture de qq pages web sur ORDER BY FIELD, il semblerait que ce soit la solution que je cherche.
    Mais je viens de me rendre compte en testant le code que la SGDB utilisée n'est pas Oracle, mais Access (mi stupido... ). En effet, les données sont bien stockées sous Oracle, mais une base Access "tampon" est utilisée en local, et acslXtreme lit une vue de la base Oracle stockée dans la base Access. [Désolé, je suis débutant en SQL, et je ne savais pas que le SQL était implémenté différemment entre les différentes SGDB (je pensais que c'était un standard)]

    J'obtiens l'erreur suivante en utilisant cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Error in function sqlQuery:
    	Code = 800a0c0d
    	Code meaning = Unknown error 0x800A0C0D
    	Source = DAO.Database
    	Description = Fonction 'FIELD' non définie dans l'expression.
    C'est Source = DAO.Database qui m'a fait me rappeler le fait que c'est la base Access qui est lue.
    Ma question suivante est donc: FIELD est-il utilisable sous Access? Si non, existe-t-il un equivalent?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 9
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Salut,
    A mon avis il faut utiliser une colonne fictive pour créer un ordre par nombre, unir les résultats et enfin les trier selon cet ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TEXT, 1 as ordre FROM MYTAB WHERE NOMBRE = 2
    UNION ALL
    SELECT TEXT, 2 as ordre FROM MYTAB WHERE NOMBRE = 8
    UNION ALL
    SELECT TEXT, 3 as ordre FROM MYTAB WHERE NOMBRE = 5
    order by ordre
    Mais je ne sais pas si cette solution peut te convenir.
    Bon c'est peut être possible de créer la colonne ordre tout en évitant les UNION ALL, mais ça restera peu intuitif.
    Merci pour la suggestion, je vais essayer ca. Je ne connais pas UNION : est-ce que la solution que tu me proposes constitue une seule et unique requête?

    Mon problème est de limiter au maximum le nombre de requête SQL, car chaque requête est assez lente (acslXtreme, le logiciel que j'utilise a un support très rudimentaire & non optimisé de ces requêtes, et la base de données est sur un serveur).
    Si je n'avais pas ce problème de vitesse, la solution la plus simple serait de faire 2 requêtes : une pour récupérer NOMBRE, une pour récupérer TEXTE, puis d'utiliser le langage d'analyse d'acslXtreme pour retrouver les valeurs qui m'intéressent.
    D'où ma question pour faire ca directement en 1 étape dans la requête SQL...

  9. #9
    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
    Citation Envoyé par sirfratus Voir le message
    est-ce que la solution que tu me proposes constitue une seule et unique requête?
    Oui c'est une seule requête mais évidemment le mode d'accès aux données est différent de celui d'un IN et sûrement moins performant. La requête proposée est plus une solution de contournement, qu'une vrai solution...

    Merci Cybher pour le ORDER BY FIELD, je ne connaissais pas, mais ça ne marche pas sur oracle non plus. Ca ressemble a une spécificité mysql, tu l'as déjà utilisé sur d'autres SGBDs?

  10. #10
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Merci Cybher pour le ORDER BY FIELD, je ne connaissais pas, mais ça ne marche pas sur oracle non plus. Ca ressemble a une spécificité mysql, tu l'as déjà utilisé sur d'autres SGBDs?
    c'est peut être effectivement spécifique à MySQL... mais je n'étais pas sur

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Il ne s'agit pas de ORDER BY FIELD, mais simplement de la fonction FIELD() dans un ORDER BY. Et effectivement, cette fonction n'existe ni dans Access, ni dans Oracle.

    La solution de skuatamad est bonne, et techniquement parlant, c'est une seule requête. Par contre, je pense que les performances seront assez mauvaises (à tester).

    Une alternative sous Oracle serait le DECODE() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY DECODE(nombre, 2, 1, 8, 2, 5, 3)
    Autrement dit, 2 => 1ère position, 8 => 2ème, 5 => 3ème.

    L'équivalent sous Access serait switch() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY DECODE(nombre = 2, 1, nombre = 8, 2, nombre = 5, 3)
    Enfin, en syntaxe normalisée, il faudrait utiliser la structure CASE WHEN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORDER BY CASE nombre 
      WHEN 2 THEN 1
      WHEN 8 THEN 2
      WHEN 5 THEN 3
    END
    Oracle comprend, et peut-être les versions récentes d'Access aussi ?

Discussions similaires

  1. Probléme tri des donnée de sortie
    Par jeannotmer dans le forum 4D
    Réponses: 10
    Dernier message: 12/07/2007, 15h57
  2. [IN] - Tri des données
    Par kirsoul dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/05/2006, 15h36
  3. tri des données différent entre 2 bases
    Par j6m dans le forum Oracle
    Réponses: 2
    Dernier message: 12/03/2006, 10h17
  4. [Access] Enregistrer des données de type Texte RTF
    Par portu dans le forum Bases de données
    Réponses: 22
    Dernier message: 27/10/2005, 22h54
  5. [JTable] Tri des données
    Par soulhouf dans le forum Composants
    Réponses: 7
    Dernier message: 08/09/2005, 14h01

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