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 :

Case dans Where (encore !)


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Par défaut Case dans Where (encore !)
    Bonjour,

    Je sais que le sujet a déjà été traité mais il me semble que mon cas est plus compliqué

    Je travaille sur une base oracle d'un JDE.

    Je suis en train de faire une requête "en cascade" sur les nomenclatures de production. Le fils de BoM_1 est le père BoM_2, le fils de BoM_2 est le père de BoM_3 etc..

    Le but est d'arriver au dernier niveau pour connaître les besoins en composants de dernier niveau en fonction des produits finis du premier niveau;

    Les tables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM   "PRODDTA"."F3002" "F3002_1"
    LEFT OUTER JOIN "PRODDTA"."F3002" "F3002_2" ON "F3002_1".IXLITM="F3002_2".IXKITL
    LEFT OUTER JOIN "PRODDTA"."F3002" "F3002_3" ON "F3002_2".IXLITM="F3002_3".IXKITL
    ...etc.

    Je "déroule" ma requête sur 6 niveaux.

    Jusqu'ici tout va bien.

    Le problème est que je dois faire une sélection sur les dates de validité des liens de nomenclatures, donc tester chaque niveau en fonction du nombre de niveaux:
    - Si j'ai 6 niveaux je teste la date des 6 tables;
    - Si j'ai 5 niveaux je teste la date des 5 premières tables;
    ...etc.

    Donc, mon CASE pour savoir si j'ai 6 niveau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (CASE 
    WHEN "F3002_6".IXKITL IS NOT NULL 
    AND 
    "F3002_5".IXKITL IS NOT NULL 
    AND 
    "F3002_4".IXKITL IS NOT NULL 
    AND 
    "F3002_3".IXKITL IS NOT NULL
     AND
    "F3002_2".IXKITL IS NOT NULL
    THEN 
    "F3002_6".'6_Level'
    Et mon WHERE lorsque j'ai 6 niveaux est (attention transformation de date de JDE qui sont au format SAAQQQ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    WHERE
     
    ((100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')>="F3002_1".IXEFFF AND 
    100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')<="F3002_1".IXEFFT)
     
    AND
     
    (100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')>="F3002_2".IXEFFF AND 
    100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')<="F3002_2".IXEFFT)
     
    AND
     
    (100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')>="F3002_3".IXEFFF AND 
    100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')<="F3002_3".IXEFFT) 
     
    AND
     
    (100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')>="F3002_4".IXEFFF AND 
    100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')<="F3002_4".IXEFFT)
     
    AND
     
    (100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')>="F3002_5".IXEFFF AND 
    100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')<="F3002_5".IXEFFT) 
     
    AND
     
    (100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')>="F3002_6".IXEFFF AND 
    100000+(SUBSTR(TO_CHAR(CURRENT_DATE,'YYYY'),-2)*1000)+TO_CHAR(CURRENT_DATE,'DDD')<="F3002_6".IXEFFT))
    Comment faire ?
    Merci de votre aide !

  2. #2
    Membre averti
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Par défaut
    Ma logique n'était pas la bonne. Il faut traiter ce problème avec des groupes dans la clause WHERE.

    Par contre, j'ai travaillé sur 6 niveaux parce que je ne sais pas faire des requêtes récursives. Je vais aller voir les tutos sur le sujet.

  3. #3
    Membre averti
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Par défaut
    Ce type de requête récursive ne semble pas possible sur Oracle:

    La création de requêtes récursive à la norme SQL:1999 (WITH RECURSIVE / UNION ALL) existe dans les SGBDR suivants :
    IBM DB2 v8 et suivants
    SQL Server 2005 (et 2008)
    Elle n'existe pas dans les autres SGBDR comme MySQL, Oracle, PostGreSQL, Interbase, FireBird....

    Oracle propose CONNECT BY / PRIOR, mais ne peut traiter que le parcours d'arbres par le parcours de graphes. C'est une lacule du moteur Oracle et c'est pourquoi le commité de normalisation de SQL n'a pas retenue la solution de Oracle.
    Des commentaires ?

  4. #4
    Membre émérite
    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
    Par défaut
    Oracle le supporte depuis la 11gR2.

Discussions similaires

  1. Oracle : Case dans Where qui retourne une liste
    Par stof dans le forum Oracle
    Réponses: 9
    Dernier message: 29/07/2011, 10h21
  2. utilisation d'un case dans un where
    Par stephyugh dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/10/2007, 17h31
  3. un CASE dans un WHERE...
    Par nox75 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/09/2007, 14h47
  4. Problème de syntaxe d'un CASE dans un WHERE?
    Par Danny Blue dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/04/2007, 23h18
  5. [t-sql] instruction CASE dans clause WHERE
    Par ignitionflip dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/01/2007, 18h07

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