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 :

[Oracle] Least plusieurs colonnes avec exists/null


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2003
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 84
    Par défaut [Oracle] Least plusieurs colonnes avec exists/null
    Deux tables : Alpha et Beta

    Alpha, a quatre colonnes :
    Code - ValeurA - ValeurB - ValeurC
    x - 2 - 3 - 0
    y - 1 - 3 - 2

    Beta , a deux colonnes :
    Code - Libelle
    x - A
    x - B
    y - A
    y - C


    Ce que je veux est assez compliqué à décrire, donc voici directement des exemples :

    En entrée j'ai : "x"
    1 - je récupère les valeurs possibles pour x dans la table Beta
    --> on doit me retourner A et B via la table Beta
    2 - à partir de la table alpha je récupère la valeur minimum pour "x" parmi les colonnes A et B
    --> on doit me retourner 2

    En entrée j'ai : "y"
    1 - je récupère les valeurs possibles pour y dans la table Beta
    --> on doit me retourner A et C via la table Beta
    2 - à partir de la table alpha je récupère la valeur minimum pour "y" parmi les colonnes A et C
    --> on doit me retourner 1


    Et je veux réaliser cela via, si possible, une seule requête SQL.

    Pour infos je suis sur du Oracle.

    Voilà ce que j'ai essayé, mais je ne trouve pas le bon résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    select least(
      (select case when exists(select be.code from dual where be.libelle = 'A' and be.code=al.code) 
            then al.valeurA else 0 end from beta b, alpha al  
            where al.code = be.code and al.code = 'x')
      ,
      (select case when exists(select be.code from dual where be.libelle = 'B' and be.code=al.code) 
            then al.valeurB else 0 end from beta b, alpha al  
            where al.code = be.code and al.code = 'x')
      ,
      (select case when exists(select be.code from dual where be.libelle = 'C' and be.code=al.code) 
            then al.valeurC else 0 end from beta b, alpha al  
            where al.code = be.code and al.code = 'x')
    ) from dual
    Le problème de cette requête réside dans le fait qu'un least avec une valeur null renvoie null.

    Merci de votre aide

  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,

    J'ai fait ça, dis moi si ça convient :
    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
    SQL> with alpha as (select 'x' as code,2 as valeurA, 3 as valeurB, 0 as valeurC from dual
      2  union select 'y' as code,1 as valeurA, 3 as valeurB, 2 as valeurC from dual),
      3  beta as (select 'x' as code, 'A' as libelle from dual
      4  union select 'x' as code, 'B' as libelle from dual
      5  union select 'y' as code, 'A' as libelle from dual
      6  union select 'y' as code, 'C' as libelle from dual)
      7  select code,
      8         min(least(least(valA,valB),valC))
      9  from (
     10  select a.code,
     11         case when b.libelle='A' then a.valeurA else 1000000000 end as valA,
     12         case when b.libelle='B' then a.valeurB else 1000000000 end as valB,
     13         case when b.libelle='C' then a.valeurC else 1000000000 end as valC
     14  from alpha a
     15  JOIN beta b ON a.code=b.code
     16  )
     17  group by code;
     
    C MIN(LEAST(LEAST(VALA,VALB),VALC))
    - ---------------------------------
    x                                 2
    y                                 1
    PS : Je te laisse gérer la valeur max, j'ai mis 1000000000 qui est très grand, mais peut être pas encore assez.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2003
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 84
    Par défaut
    Avec le code ci-dessous ça semble marcher, mais la requête me semble complexe...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select least(
      (select min(case when exists(select be.code from dual where be.libelle = 'A' and be.code=al.code) 
            then al.valeurA else 100 end) from beta be) 
      ,
      (select min(case when exists(select be.code from dual where be.libelle = 'B' and be.code=al.code) 
            then al.valeurB else 100 end) from beta be) 
      ,
      (select min (case when exists(select be.code from dual where be.libelle = 'C' and be.code=al.code) 
            then al.valeurC else 100 end) from beta be) 
    ) valeur from alpha al where al.code = 'z'

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2003
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 84
    Par défaut
    On s'est croisé.

    Merci pour la réponse

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

Discussions similaires

  1. Selectionner plusieurs colonnes avec distinct
    Par godjojo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/10/2007, 14h21
  2. Selection de plusieurs colonnes avec une zone de liste
    Par vinzeffect dans le forum Access
    Réponses: 3
    Dernier message: 20/01/2007, 22h51
  3. plusieurs colonnes avec opérateur IN
    Par inluvwitiou dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/03/2006, 13h29
  4. Requête à plusieurs colonnes avec la fonction COUNT
    Par zigune dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/11/2004, 10h43
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

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