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 :

ORA-01799 sur un outer join avec select imbriqué


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut ORA-01799 sur un outer join avec select imbriqué
    Bonjour

    Je n'arrive pas à faire un outer join avec une clause "in (select ...)" dedans. J'obtiens toujours l'erreur ORA-01799.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Select 
    mpf.mpf_code_log, mpf.mpf_ind_log, mpf_des_atl 
    , mcd.mcd_val "Prix de cession"
    From Matpro mpf
    Left outer join mpfcoutdet mcd
    --inner join mpfcoutdet mcd
        On mcd.mpf_code=mpf.mpf_code and mcd.mpf_ind=mpf.mpf_ind 
        And mcd.mcd_date=
                (select max(mcd_date) from mpfcoutdet mcd2 
                 where mcd2.mpf_code=mpf.mpf_code and mcd2.mpf_ind=mpf.mpf_ind )       
    Order by 1,2
    Je souhaite retrouver , chaque code MATPRO, la plus récente de ses valeurs MPFCOUTDET, qui bien, ne portent pas sur la meme date pour tous les codes.
    La requete fonctionne avec le inner join (mis en commentaire dans le code) mais pas avec le outer join.

    Comment puis-je retrouver ce genre d'infos ?

    Merci à vous
    Loko

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    ce problème est spécifique à Oracle. De ce fait peut être qu'une solution Oracle est disponible mais je ne la connais pas.

    En non spécifique il vous faudra utiliser 2 requête réuni par un UNION ALL.
    La 1ere requête fera un inner joii avec votre table "mpfcoutdet"et la 2eme un exception join pour retrouver tous les champs sans correspondance dans "mpfcoutdet"

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Loko Voir le message
    ...
    Je souhaite retrouver , chaque code MATPRO, la plus récente de ses valeurs MPFCOUTDET, qui bien, ne portent pas sur la meme date pour tous les codes.
    La requete fonctionne avec le inner join (mis en commentaire dans le code) mais pas avec le outer join.
    ...
    Fonctionne avec le inner join ça veut dire qu'il n'y pas d'erreur Oracle parce qu'elle ne fonctionne pas dans le sens des résultats attendues
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> Select d.department_id, e.employee_id, e.job_id
      2    From hr.departments d
      3         Join
      4         hr.job_history e
      5      On (    d.department_id = e.department_id
      6         )
      7  Order by 1, 2
      8  /
     
    DEPARTMENT_ID EMPLOYEE_ID JOB_ID
    ------------- ----------- ----------
               20         201 MK_REP
               50         114 ST_CLERK
               50         122 ST_CLERK
               60         102 IT_PROG
               80         176 SA_REP
               80         176 SA_MAN
               90         200 AC_ACCOUNT
               90         200 AD_ASST
              110         101 AC_MGR
              110         101 AC_ACCOUNT
     
    10 rows selected
    SQL> Select d.department_id, e.employee_id, e.job_id
      2    From hr.departments d
      3         Join
      4         hr.job_history e
      5      On (    d.department_id = e.department_id
      6          And e.job_id = (Select Max(e.job_id)
      7                              from hr.job_history e1
      8                             where e1.employee_id = e.employee_id
      9                            )
     10         )
     11  Order by 1, 2
     12  /
     
    DEPARTMENT_ID EMPLOYEE_ID JOB_ID
    ------------- ----------- ----------
               20         201 MK_REP
               50         114 ST_CLERK
               50         122 ST_CLERK
               60         102 IT_PROG
               80         176 SA_REP
               80         176 SA_MAN
               90         200 AC_ACCOUNT
               90         200 AD_ASST
              110         101 AC_MGR
              110         101 AC_ACCOUNT
     
    10 rows selected
     
    SQL>
    Probablement que vous cherchez à exécuter une requête de ce type
    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
     
    SQL> Select d.department_id, e.employee_id, e.job_id
      2    From hr.departments d
      3         /* Left Outer */ Join
      4         (Select h.employee_id, h.department_id, Max(h.job_id) job_id
      5            From hr.job_history h
      6           Group By h.employee_id, h.department_id
      7         ) e
      8      On (    d.department_id = e.department_id)
      9  Order by 1, 2
     10  /
     
    DEPARTMENT_ID EMPLOYEE_ID JOB_ID
    ------------- ----------- ----------
               20         201 MK_REP
               50         114 ST_CLERK
               50         122 ST_CLERK
               60         102 IT_PROG
               80         176 SA_REP
               90         200 AD_ASST
              110         101 AC_MGR
     
    7 rows selected

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Je n'avais pas pensé à cette syntaxe !

    Merci, j'essaie cela.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 1
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    J'ai exactement la même erreur avec le même genre de requête (LEFT OUTER JOIN avec clause : [date]=(SELECT MAX([DATE] ...) mais seulement en Oracle 11g R2. La même requête s'exécute très bien en Oracle 9i et 10g...

    Sauriez-vous pourquoi l'erreur apparaît seulement en Oracle 11g" ?
    . Une évolution volontaire ou un bug en Oracle 11g ?
    . Un paramètre d'instance mal défini ?
    . ... ?

  6. #6
    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
    Je ne saurai vous répondre sur le pourquoi, mais je peux vous garantir qu'une requête avec une sous-requête dans une clause de jointure est une requête mal écrite.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 27
    Points
    27
    Par défaut
    effectivement, pourquoi ne pas rajouter une clause where après la jointure?

Discussions similaires

  1. LEFT OUTER JOIN avec requete imbriquée ?
    Par disciplined dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/07/2010, 18h50
  2. OUTER JOIN avec un OR
    Par Ujitsu dans le forum SQL
    Réponses: 9
    Dernier message: 30/03/2007, 15h29
  3. Outer join avec condition OR
    Par Ujitsu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/03/2007, 23h08
  4. Utilisation d'un filtre directement sur 'LEFT OUTER JOIN'
    Par lodan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/03/2007, 17h17
  5. Réponses: 6
    Dernier message: 06/10/2006, 23h15

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