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

SQL Oracle Discussion :

Tentative de simplification d'une requête


Sujet :

SQL Oracle

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut Tentative de simplification d'une requête
    Bonjour,

    J'ai les tables suivantes :

    PRO (produit)
    codsoc (société)
    codpro (code produit)
    codzn15 (code produit stock)
    coduni (code unité)

    PRC (assortiment client)
    codsoc (société)
    typtie (type de tiers)
    sigfou (sigle du tiers)
    codpro (code produit)
    codzn2 (code produit à préparer)

    Le lien est le suivant :
    Pour un même CODSOC, pour TYPTIE = 'CLI', on a dans PRC la liste des CODPRO produits disponibles à la vente pour le client SIGFOU. Le PRC.CODZN2 est le produit à préparer dans le camion lorsque le client commande le produit. Le PRO.CODZN15 est le produit stock. L'unité d'un produit est PRo.CODUNI.

    Par exemple :
    - Je stock du lait en palettes (PRO.CODZN15)
    - Je le gère dans mon article sous forme de bouteilles de 1 litre (PRO.CODPRO et PRC.CODPRO)
    - Le client me l'achète en pack de 6 bouteilles (PRC.CODZN2)

    Maintenant, j'ai la demande suivante, pour une application de prévisions de vente :

    On doit faire des prévisions de vente sur le produit à préparer, sauf si ce dernier est un colis ou unité, à ce moment on prend le produit stock.
    Le produit est retourné sans la première lettre.

    Pour savoir si une unité est acceptable pour l'outils de prévisions de vente, il faut que :
    - Soit l'unité commence par P, B ou D et qu'elle soit différente de PI

    PRC.CODZN2 n'est pas toujours rempli, à ce moment je dois prendre PRO.CODZN15
    Le produit n'est pas forcément assorti chez le client (il y a d'autres tables qui jouent dans la requête, et je peux avoir des produits qui ne sont pas dans PRC, à ce moment je dois prendre PRO.CODZN15

    J'ai donc fait cette requête (Oracle, désolé pour la syntaxe DECODE) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select p1.codsoc, r.sigfou, SUBSTR(decode(nvl(p2.coduni, ' '), ' ', pro.codzn15, 'PI', pro.codzn15, decode(substr(p2.coduni, 1, 1), 'P', prc.codzn2, 'D', prc.codzn2, 'B', prc.codzn2, pro.codzn15)),2,9)
    from pro p1
    left outer join prc r on r.codsoc = p1.codsoc and r.r.typtie = 'CLI' and r.codpro = p1.codpro
    left outer join pro p2 on p2.codsoc = r.codsoc and p2.codpro = r.codpro
    Le DECODE me semble très barbare.
    Vous voyez une solution magique pour simplifier la chose ?
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ne connaissant pas encore l'idiôme Oracle, je vais juste répondre sur ce que je ferais sur ça :
    Pour savoir si une unité est acceptable pour l'outils de prévisions de vente, il faut que :
    - Soit l'unité commence par P, B ou D et qu'elle soit différente de PI
    Ça veut dire que tu fais une restriction sur les lignes retournées à celles dont le coduni commence par P, B ou D et ne commence pas pas PI ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE SUBSTRING(coduni FROM 1 FOR 1) IN ('P', 'B', 'D')
        AND SUBSTRING(coduni FROM 1 FOR 2) <> 'PI'
    Et pour ceci :
    Le produit est retourné sans la première lettre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBSTRING(la_colonne FROM 2 FOR (CHARACTER_LENGTH(la_colonne) - 1))
    À voir si Oracle accepte cette syntaxe normalisée.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Hmmm, en effet, c'est pas plus compliqué que ça... Et ça simplifie le DECODE, qui est pas très lisible...

    Je vais voir dans quelle mesure je peux implémenter la restriction dans le WHERE.
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    À voir si Oracle accepte cette syntaxe normalisée.
    Non, c'est la fonction SUBSTR.

  5. #5
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    @CinePhil : Par curiosité il n'est pas mieux d'utiliser un LIKE et NOT LIKE dans le where plutôt qu'un SUBSTR ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE ( coduni like 'P%' OR coduni like 'D%' coduni like 'B%' )
    AND coduni not like 'PI%'
    ~ Lola ~

  6. #6
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Et pour ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBSTRING(la_colonne FROM 2 FOR (CHARACTER_LENGTH(la_colonne) - 1))
    À voir si Oracle accepte cette syntaxe normalisée.
    Tu peux simplifier normalement en :
    ~ Lola ~

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lola06 Voir le message
    @CinePhil : Par curiosité il n'est pas mieux d'utiliser un LIKE et NOT LIKE dans le where plutôt qu'un SUBSTR ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE ( coduni like 'P%' OR coduni like 'D%' coduni like 'B%' )
    AND coduni not like 'PI%'
    Je préfère LIKE 'X%' car lorsque le % se trouve en fin de pattern, le LIKE utilise les index.

    Alors que je ne suis pas sûr du tout que SUBSTR (même s'il commence au caractère 1) puisse le faire.
    D'autant que je trouve bien plus lisible un LIKE qu'un SUBSTR, qui demande à lire à la fois la chaîne recherchée et l'endroit de la recherche.
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Effectivement, le LIKE est plus simple et probablement plus performant pour la raison évoquée par stringbuilder.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Simplification d'une requête
    Par Poulain dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/09/2010, 00h25
  2. Simplification d'une requête
    Par edogawa dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/07/2010, 07h56
  3. simplification d'une requête
    Par Jasmine80 dans le forum Requêtes
    Réponses: 12
    Dernier message: 20/04/2009, 21h45
  4. Simplification d'une requête SQL
    Par nicou50 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 07/09/2006, 06h37
  5. Simplification d'une requête UNION
    Par eautret dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/01/2005, 14h51

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