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

Oracle Discussion :

[ORACLE 9i] Sous-interrogation dans la projection


Sujet :

Oracle

  1. #1
    Ito
    Ito est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Points : 35
    Points
    35
    Par défaut [ORACLE 9i] Sous-interrogation dans la projection
    Bonjour,

    A l'exécution de la requête ci-dessus j'ai le message d'erreur suivant:
    erreur: Code:-1427 Message:ORA-01427: single-row subquery returns more than one row
    Donc ma sous-interrogation dans la projection me ramène plus d'une ligne pour faire
    le DECODE ce qui veut dire dans mon cas qu'on a deux types différents du DECODE (en l'occurence 1 et 3)
    pour une même ligne.
    Pour règler ce problème et donc ne ramener qu'une ligne, je veux retenir la date maximum.
    Comment faire ?

    SELECT at2f.at2fcodefouarpe
    , at2f.at2fdatcap
    , at2f.at2fdatcatpre
    , DECODE(
    (
    SELECT 1 code
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') >= at2f.at2fdatcatpremax
    UNION ALL
    SELECT 2 code
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') < at2f.at2fdatcatpremax
    AND to_char(SYSDATE, 'YYYY-MM-DD') > at2f.at2fdatcatpremin
    UNION ALL
    SELECT 3 code
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') <= at2f.at2fdatcatpremin
    )
    , 1
    , at2f.at2fdatcatpremax
    , 2
    , at2f.at2fdatcatpremax
    , 3
    , at2f.at2fdatcatpremin
    )
    , at2f.at2fdatcatpremax
    , at2f.at2fdatcatpremin
    , at2f.at2fcodeucarpe
    FROM at2f_arpefop at2f
    WHERE at2f.at2fflagmaxetatembal = 'O'
    AND at2f.at2fflagmaxindproachat = 'O'

  2. #2
    Ito
    Ito est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Une fausse manip m'a fait valider rapidement mon précédent post.
    Voici la bonne requête:

    SELECT at2f.at2fcodefouarpe
    , at2f.at2fdatcap
    , at2f.at2fdatcatpre
    , DECODE(
    (
    SELECT 1
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') >= at2f.at2fdatcatpremax
    UNION ALL
    SELECT 2
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') < at2f.at2fdatcatpremax
    AND to_char(SYSDATE, 'YYYY-MM-DD') > at2f.at2fdatcatpremin
    UNION ALL
    SELECT 3
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') <= at2f.at2fdatcatpremin
    )
    , 1
    , at2f.at2fdatcatpremax
    , 2
    , at2f.at2fdatcatpremax
    , 3
    , at2f.at2fdatcatpremin
    )
    , at2f.at2fdatcatpremax
    , at2f.at2fdatcatpremin
    , at2f.at2fcodeucarpe
    FROM at2f_arpefop at2f
    WHERE at2f.at2fflagmaxetatembal = 'O'
    AND at2f.at2fflagmaxindproachat = 'O'

    Ma question comment je peux faire un max de ce bloc

    SELECT 1
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') >= at2f.at2fdatcatpremax
    UNION ALL
    SELECT 2
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') < at2f.at2fdatcatpremax
    AND to_char(SYSDATE, 'YYYY-MM-DD') > at2f.at2fdatcatpremin
    UNION ALL
    SELECT 3
    FROM dual
    WHERE to_char(SYSDATE, 'YYYY-MM-DD') <= at2f.at2fdatcatpremin

    pour ramener une seule ligne que le DECODE va interpréter ?

    Merci d'avance.

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Pense aux balises CODE la prochaine fois...

    pour faire un max, le mieux est d'utiliser MAX

    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
    select MAX(N)
    from (
    SELECT 1 N
     FROM dual
     WHERE to_char(SYSDATE, 'YYYY-MM-DD') >= at2f.at2fdatcatpremax
    UNION ALL
    SELECT 2
     FROM dual
     WHERE to_char(SYSDATE, 'YYYY-MM-DD') < at2f.at2fdatcatpremax
     AND to_char(SYSDATE, 'YYYY-MM-DD') > at2f.at2fdatcatpremin
    UNION ALL
    SELECT 3
     FROM dual
     WHERE to_char(SYSDATE, 'YYYY-MM-DD') <= at2f.at2fdatcatpremin
    )
    Remarque: Est ce que tu sais utiliser les CASE, j'ai l'impression que ce serais plus adapté dans ton cas

    http://download-uk.oracle.com/docs/c...ressions5a.htm

  4. #4
    Ito
    Ito est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par remi4444
    pour faire un max, le mieux est d'utiliser MAX

    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
    select MAX(N)
    from (
    SELECT 1 N
     FROM dual
     WHERE to_char(SYSDATE, 'YYYY-MM-DD') >= at2f.at2fdatcatpremax
    UNION ALL
    SELECT 2
     FROM dual
     WHERE to_char(SYSDATE, 'YYYY-MM-DD') < at2f.at2fdatcatpremax
     AND to_char(SYSDATE, 'YYYY-MM-DD') > at2f.at2fdatcatpremin
    UNION ALL
    SELECT 3
     FROM dual
     WHERE to_char(SYSDATE, 'YYYY-MM-DD') <= at2f.at2fdatcatpremin
    )
    Bonjour,

    J'avais testé le code ci-dessus et j'avais comme message d'erreur sur le SELECT MAX (N):
    ORA-00936: missing expression

    Citation Envoyé par remi4444
    Remarque: Est ce que tu sais utiliser les CASE, j'ai l'impression que ce serais plus adapté dans ton cas
    Je n'ai jamais utilisé les CASE avec ORACLE, comment ça marche ?

    Merci pour toutes les informations.

    Cdlt.

  5. #5
    Ito
    Ito est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    J'ai vu la syntaxe du CASE, exemple:

    SELECT col1,
    CASE WHEN (col1 = 1) THEN 'One'
    WHEN (col1 = 2) THEN 'Two'
    END
    FROM table1;

    et j'ai essayé ceci:

    SELECT at2fnumapproarpe
    , at2fnatpiearpe
    , at2ftradpliraftfou
    , at2fdatcatpre
    , SELECT MAX (n) FROM (
    SELECT SYSDATE n
    CASE
    WHEN SYSDATE >= at2fdatcatpremax THEN at2fdatcatpremax
    WHEN SYSDATE < at2fdatcatpremax AND SYSDATE > at2fdatcatpremin THEN at2f.at2fdatcatpremax
    WHEN SYSDATE <= at2fdatcatpremin THEN at2fdatcatpremin
    END
    FROM DUAL
    )
    , at2fdatcatpremax
    , at2fdatcatpremin
    FROM at2f_arpefop
    WHERE at2fflagmaxetatembal = 'O'
    AND at2fflagmaxindproachat = 'O'
    /

    et voici le message d'erreur que j'ai:

    , SELECT MAX (n) FROM (
    *
    ERROR at line 5:
    ORA-00936: missing expression


    Cdlt.

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Il doit manquer des parenthèses autour du bloc avec le MAX.
    Le case, c'était justement pour éviter les sous-select, à partir de ta requête de départ je vois bien un truc du genre :

    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
     
    SELECT at2f.at2fcodefouarpe
    , at2f.at2fdatcap
    , at2f.at2fdatcatpre
    CASE 
      WHEN to_char(SYSDATE, 'YYYY-MM-DD') <= at2f.at2fdatcatpremin
        THEN  at2f.at2fdatcatpremin
      WHEN to_char(SYSDATE, 'YYYY-MM-DD') < at2f.at2fdatcatpremax
           AND to_char(SYSDATE, 'YYYY-MM-DD') > at2f.at2fdatcatpremin
        THEN at2f.at2fdatcatpremax
      WHEN to_char(SYSDATE, 'YYYY-MM-DD') >= at2f.at2fdatcatpremax
        THEN at2f.at2fdatcatpremax
    END ColonneCase
    , at2f.at2fdatcatpremax
    , at2f.at2fdatcatpremin 
    , at2f.at2fcodeucarpe
    FROM at2f_arpefop at2f
    WHERE at2f.at2fflagmaxetatembal = 'O'
    AND at2f.at2fflagmaxindproachat = 'O'
    ps:tu gères tes priorités avec l'ordre dans lequel tu mets tes WHEN.

    pps: il faut voir le DECODE comme un CASE simplifié, ou il n'y a que des égalités comme comparaison. Si tu as autre chose que de simples égalités à tester alors il faut revenir au CASE.

    ppps: pour les to_char (or not to_char) ça dépend de tes types de colonne t2fdatcatpremax, at2fdatcatpremin

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/05/2012, 12h49
  2. Sous-requete dans un update Oracle
    Par ThomasParis dans le forum SQL
    Réponses: 6
    Dernier message: 09/02/2010, 12h50
  3. Sous-forums dans le forum Oracle
    Par Ora92_IDS dans le forum Oracle
    Réponses: 1
    Dernier message: 19/02/2007, 08h12
  4. Réponses: 2
    Dernier message: 06/12/2006, 13h36

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