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 :

[PLSQL] select imbriqué avec clause (+)


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut [PLSQL] select imbriqué avec clause (+)
    Bonjour,

    Je vous présente tout d'abord ma requête, afin que vous fassiez connaissance:

    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  BLABLABLA
    FROM BLABLABLBLA
    WHERE 
     A.IDA3MASTERREFERENCE = AM.IDA2A2 AND
     AM.ORACLESUBSCRIPTION = 1 AND
     A.LATESTITERATIONINFO  = 1 AND
     A.IDA3VIEW = W.IDA2A2 AND
     AM.IDA2A2 = N.IDA3A5(+)  AND
     N.MODSNUMBER = (select max(NN.MODSNUMBER) from NTP NN where AM.IDA2A2 = NN.IDA3A5)  AND
     AM.IDA3C6 = C.IDA2A2(+) AND
     AM.IDA3G6 = CT.IDA2A2(+) AND
     W.NAME = 'MFG_GUY' AND
    Mon problème:

    Il n'est pas forcé que la clause AM.IDA2A2 = N.IDA3A5 soit vérifiée, d'où le (+). Mais, le cas écheant, je veux alors récupérer le max des MODSNUMBER de tous le N liés à mon AM ( parce qu'il peut y avoir plusieurs...). Problème: je n'arrive pas à ajouter la condition selon laquelle cette clause n'est pas nécessairement présente (+)... Du coup, si je n'ai pas de lien entre N et AM, la requête ne me récupère pas l'article...

    Quelqu'un aurait-il une piste.....?

    Merci par avance.

    Bertrand.

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    J'ai essayé de simplifier votre exemple et d'interprêter le résultat souhaité avec des exemples de données. Merci de les commenter et de les corriger si nécessaire:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    
    SQL> 
    SQL> DROP TABLE a;
    
    Table dropped.
    
    SQL> DROP TABLE am;
    
    Table dropped.
    
    SQL> DROP TABLE nn;
    
    Table dropped.
    
    SQL> DROP TABLE n;
    
    Table dropped.
    
    SQL> 
    SQL> CREATE TABLE a(ida3 INT);
    
    Table created.
    
    SQL> CREATE TABLE am(ida2 INT);
    
    Table created.
    
    SQL> CREATE TABLE n(ida3 INT, mods INT);
    
    Table created.
    
    SQL> CREATE TABLE nn(ida3 INT, mods INT);
    
    Table created.
    
    SQL> 
    SQL> -- doit retourner 1-1-1-11
    SQL> INSERT INTO a VALUES (1);
    
    1 row created.
    
    SQL> INSERT INTO am VALUES(1);
    
    1 row created.
    
    SQL> INSERT INTO n VALUES(1, 11);
    
    1 row created.
    
    SQL> INSERT INTO n VALUES(1, 10);
    
    1 row created.
    
    SQL> INSERT INTO nn VALUES(1, 10);
    
    1 row created.
    
    SQL> INSERT INTO nn VALUES(1, 11);
    
    1 row created.
    
    SQL> 
    SQL> 
    SQL> -- doit retourner 2-2-2-20
    SQL> -- (et rien d'autre)
    SQL> INSERT INTO a VALUES (2);
    
    1 row created.
    
    SQL> INSERT INTO am VALUES(2);
    
    1 row created.
    
    SQL> INSERT INTO n VALUES(2, 20);
    
    1 row created.
    
    SQL> INSERT INTO n VALUES(3, 30);
    
    1 row created.
    
    SQL> INSERT INTO n VALUES(3, 31);
    
    1 row created.
    
    SQL> INSERT INTO nn VALUES(3, 30);
    
    1 row created.
    
    SQL> INSERT INTO nn VALUES(3, 31);
    
    1 row created.
    
    SQL> 
    SQL> 
    SQL> COMMIT;
    
    Commit complete.
    
    SQL> 
    SQL> 
    SQL> SELECT *
      2  FROM a, am, n
      3  WHERE
      4  a.ida3 = am.ida2 AND
      5  am.ida2 = n.ida3  AND
      6  n.mods =
      7  CASE WHEN am.ida2 = n.ida3
      8           AND EXISTS (SELECT null FROM nn WHERE am.ida2 = nn.ida3)
      9  THEN (SELECT MAX(nn.mods) FROM nn WHERE am.ida2 = nn.ida3)
     10  ELSE n.mods
     11  END;
    
          IDA3       IDA2       IDA3       MODS                                     
    ---------- ---------- ---------- ----------                                     
             1          1          1         11                                     
             2          2          2         20                                     
    
    SQL> 
    SQL> EXIT

  3. #3
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Salut à vous.
    à mon avis c'est faisable assez facilement avec une vue en ligne :

    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
     
    select  BLABLABLA
    FROM 
          BLA A
          , BLA AM
          , BLA N
          , (select max(NN.MODSNUMBER) as MaxX from BLA AM, NTP NN where AM.IDA2A2 = NN.IDA3A5) X
    WHERE 
    A.IDA3MASTERREFERENCE = AM.IDA2A2 AND
    AM.ORACLESUBSCRIPTION = 1 AND
    A.LATESTITERATIONINFO  = 1 AND
    A.IDA3VIEW = W.IDA2A2 AND
    AM.IDA2A2 = N.IDA3A5(+)  AND
    N.MODSNUMBER (+) = X.MaxX AND
    AM.IDA3C6 = C.IDA2A2(+) AND
    AM.IDA3G6 = CT.IDA2A2(+) AND
    W.NAME = 'MFG_GUY' AND
    ne connaissant pas le détail des BLABLA... je te laisse le soin d'ajouter une ou des colonne dans le Select de la vue en ligne pour affiner ensuite la jointure avec le Select principal.

  4. #4
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci!!

    Je pense que l'idée de yorgla me mène au pieds de la solution....il ne me reste plus qu'à lui grimper sur le dos!

    Il me reste en effet à affiner la requête pour la restreindre un peu et obtenir, uniquement l'info qui m'intéresse...

    Le problème est le suivant:

    Sans les contraintes au niveau du NTP (et MODSNUMBER), j'obtiens bien les articles que je veux: les dernières révisiosns, selon la vue et l'état désiré. Seleument, quand je veux essayer de voir, ceux qui sont liés avec la table NTP, et, si c'est le cas, sachant qu'il peut y avoir plusieurs liens, je veux ne sortir que celui qui possède le MODSNUMBER le plus élevé...

    Il me manque donc une clause pour affiner ma requête mais la bouillie fumante qui me fait office de cerveau à l'heure où j'écris ce post, ne me permet pas de la déterminer...

    Voici donc l'intégralité de la requête (à part les champs à afficher qui n'ont pas grand intérêt je crois):

    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
     
    SELECT  AM.PARTNUMBER, AM.PARTCAGE, AM.PARTICD, AM.PARTID, AM.PARTDESCRIPTIONFR,N.MODSNUMBER
    FROM             ARTICLE A,
               ARTICLEMASTER AM,
               CLASSIFICATION C,
               WTVIEW W,
               WTPARTDESCRIBELINK DESCLINK,
             TYPEDOCUMENT TD,
              COMSYSDOCUMENTMASTER DM,
               COMSYSDOCUMENT D,
               NTP N,
               CTA CT,
               (select max(NN.MODSNUMBER) as MaxN from ARTICLEMASTER AM, NTP NN where AM.IDA2A2 = NN.IDA3A5) VNTP
    WHERE 
                A.TCCVERSION = (select max(tccversion) from ARTICLE AA, WTVIEW W  where AA.IDA3MASTERREFERENCE = A.IDA3MASTERREFERENCE and aa.STATESTATE = 'RFPr' AND aa.IDA3VIEW = W.IDA2A2 AND W.NAME = 'MFG_GUY') AND
               A.IDA3MASTERREFERENCE = AM.IDA2A2 AND
              AM.ORACLESUBSCRIPTION = 1 AND
              A.LATESTITERATIONINFO  = 1 AND
              A.IDA2A2 = DESCLINK.IDA3A5(+) AND
              DESCLINK.IDA3B5 = D.IDA2A2(+) AND
              D.IDA3MASTERREFERENCE = DM.IDA2A2(+) AND
              DM.IDA3B6 = TD.IDA2A2(+) AND
              AM.IDA2A2 = N.IDA3A5(+) AND
              N.MODSNUMBER = VNTP.MaxN(+) AND
              AM.IDA3C6 = C.IDA2A2(+) AND
              AM.IDA3G6 = CT.IDA2A2(+) AND
              A.IDA3VIEW = W.IDA2A2 AND
             W.NAME = 'MFG_GUY';
    Voilà, peut-être que sans les BLABLA, un être un peu plus "frais d'esprit" saura voir ce qui se cache à mes yeux!!

    Merci par avance.

    Bertrand.

  5. #5
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Personne n'a une petite idée......?

    Parce que j'ai essayé de remettre, dans ma vue en ligne (<=> le select du from principal), les conditions sine qua none (celles sans (+) ), afin d'essayer de n'obtenir que les articles que je désire (tous ceux que j'ai, sans la clause sur les NTP + leur MODSNUMBER maxi quand ils sont liés à un NTP)....et ça ne marche toujours pas....:-(

    Si un être illuminé croise ce poste...merci d'éclairer aussi mon chemin! ;-)

    Merci.

    Bertrand.

Discussions similaires

  1. Requête SELECT imbriquée avec top ACCESS
    Par blind229 dans le forum Langage SQL
    Réponses: 0
    Dernier message: 12/07/2012, 20h32
  2. Select imbriqué avec agrégat
    Par SASARITA dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/04/2012, 16h06
  3. select imbriqués avec clause where
    Par ueshiba dans le forum SAS Base
    Réponses: 2
    Dernier message: 28/09/2010, 17h56
  4. Select imbriqué avec loop
    Par Warluck dans le forum PL/SQL
    Réponses: 6
    Dernier message: 06/02/2009, 20h55
  5. Select imbriqué avec plusieurs colonne
    Par rad_hass dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/10/2008, 10h48

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