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 :

Optimisation requêtage d'une table


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 38
    Points : 59
    Points
    59
    Par défaut Optimisation requêtage d'une table
    Bonjour à tous,

    ne tâtant que peu de SQL j'aimerais solliciter votre avis sur une tentative d'optimisation de requêtage sur une seule table.

    La table A a deux champs, id et name. Tous les enregistrements sont censés exister en "couples", c'est à dire que name a une valeur qui se termine soit par "-AAA", soit par "-BBB".

    Mon besoin est de retrouver tous les couples d'enregistrement correspondant à la règle de nommage "xxx-AAA" et "xxx-BBB".

    La manière la plus simple mise en place est d'abord de chercher tous les "xxx-AAA" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT name, id from table where name like '%-AAA';
    et pour chaque ligne retournée chercher s'il existe l'autre élément du coupe "xxx-BBB" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT name, id from TABLE where name = '[name]-BBB';
    où [name] est le suffixe du name de la première requête amputé du '-AAA'.

    Pour être honnête ça me parait terrible. A mesure que le nombre de couples augmentent, ca augmente tout d'autant le nombre de requêtes. J'ai le sentiment que quelque chose de bien mieux est possible mais j'ai beau creuser du côté des sous-requêtes, de exists, et d'autres choses je n'ai pas le déclic.

    Donc si vous avez une idée qui vous saute aux yeux.

  2. #2
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Il semblerait que vous ayez un problème de conception... ça ne me paraît pas conforme à la première forme normale tout ça...

    Cordialement,

    Arkhena

  3. #3
    Membre éprouvé
    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
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Quel est votre SGBD?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT a.id AS id_a, a.name AS name_a, b.id AS id_b, b.name AS name_b
    FROM 
    (
     SELECT name, id FROM TABLE WHERE name LIKE '%-AAA' 
    ) a
    JOIN  
    (
     SELECT name, id FROM TABLE WHERE name LIKE '%-BBB' 
    ) b
    ON replace(a.name,'-AAA','') = replace(b.name,'-BBB','')
    J'ai utilisé replace pour aller plus vite (oui, c'est moche), qui ne fait pas partie de la norme SQL je crois. Normalement ça fonctione sur Oracle, SQL Server et MySQL, si ça ne fonctionne pas sur votre SGBD, regardez du coté des fonctions de chaînes de caractère disponibles (SUBSTRING et POSITION par exemple).

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 38
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    le SGBD est Postgres qui a bien une fonction replace. J'ai essayé avec succès votre requête qui me sort exactement ce dont j'ai besoin très rapidement, merci beaucoup.

    Maintenant je vais l'analyser un peu pour comprendre un peu le fonctionnement des jointures.

    Il y a une petite chose que je pourrais améliorer mais j'avoue aussi que c'est du à la conception bancale du modèle, c'est le fait que théoriquement des enregistrements avec un nom comme "-AAAqsdqsd-AAA" ou "-BBB-BBB" peuvent exister et que le replace pourrait causer quelques soucis.

    C'est là dessus qu'il faudrait que j'utilise des replace ou des substr pour purger la dernière occurrence d'une sous-chaîne dans une chaîne mais postgres est assez limité pour faire ceci, n'ayant pas de fonction de type position commençant par la fin d'une chaîne ou reverse. Je pense que je vais devoir passer par une expression régulière.

    En tout cas merci beaucoup.

  5. #5
    Membre éprouvé
    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
    Points : 965
    Points
    965
    Par défaut
    Regardez du coté de LENGTH, ce qui donnerai quelque chose comme substring(name,1,length(name)-4).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 38
    Points : 59
    Points
    59
    Par défaut
    Merci pour cette piste.

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

Discussions similaires

  1. Optimisation requête avec une table Memory
    Par ahmed. dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2012, 16h49
  2. optimisation recherche dans une table
    Par clod83 dans le forum Requêtes
    Réponses: 10
    Dernier message: 14/10/2011, 12h18
  3. [Oracle] Optimiser affichage dans une table
    Par evil_mouss dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 24/07/2009, 19h49
  4. Réponses: 4
    Dernier message: 30/05/2007, 12h59
  5. [windev10]optimisation remplissage d'une table
    Par nath-0-0 dans le forum WinDev
    Réponses: 6
    Dernier message: 16/03/2007, 15h34

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