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 8i Syntaxe : Probleme de LEFT JOIN


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Par défaut Oracle 8i Syntaxe : Probleme de LEFT JOIN
    Bonjour à tous,

    j'ai besoin de traduire une requete SQL de MsAccess en SQL pour Oracle 8i. La plupart du temps, cela demande que très peu de changement, mais j'ai une grosse requete et je n'arrive pas du tout à comprendre l'erreur qui Oracle me retourne :

    ORA-01719: outer join operator (+) not allowed in operand of OR or IN

    Voici ma requete :

    SELECT
    usreldbplus1.SAINT AS USRELDB_SAINT,
    usreldbplus1.SAEXT,
    usrelusproddoss.BEARBEITERKONSTR,
    usrelusproddoss.CHBEARBEITERPROD,
    usreldbplus1.ANR,
    usreldbplus1.IPOS,
    usreldbplus1.DOSSIER,
    usreldbplus1.MNR,
    usrelac1.KTXT AS USRELAC_KTXT,
    usrelfirma1.NAME,
    usreldbplus1.KOMM,
    usreldbplus1.AGNR,
    usreldbplus1.KTXT AS USRELDB_KTXT,
    usreldbplus1.UTNR,
    usrelac2.KTXT AS USRELAC_1_KTXT,
    usreldbplus2.ZUST,
    usreldbplus2.ANRWS,
    usreldbplus2.ZDESC,
    usreldbplus1.MENG_4,
    usreldbplus1.ME,
    usrelac2.ME AS ME_A,
    usreldbplus1.DAUER_4,
    usreldbplus2.TERM_4 AS Del,
    usreldbplus2.LAGER,
    usrelusproddoss.DOSSIERKTXT
    FROM
    USRELDBPLUS usreldbplus1,
    USRELDBPLUS usreldbplus2,
    USRELAC usrelac1,
    USRELFIRMA usrelfirma1,
    USRELAC usrelac2,
    USRELUSPRODDOSS usrelusproddoss
    WHERE
    ((((
    usreldbplus1.ANR = usreldbplus2.ANR) AND
    usreldbplus1.MNR = usrelac1.MNR(+) ) AND
    usreldbplus1.MNR = usrelfirma1.FIRMANR(+) ) AND
    usreldbplus1.UTNR = usrelac2.MNR(+) ) AND
    usreldbplus1.DOSSIER = usrelusproddoss.DOSSIERNR(+) AND

    usreldbplus1.SAINT='60' OR usreldbplus1.SAINT ='115' AND
    usreldbplus1.ANR NOT Like 'OF*' AND
    usreldbplus2.ANRWS<>'60' AND usreldbplus2.ANRWS<>'70' AND
    usreldbplus2.ZDESC NOT Like 'ENTRÉ' AND
    usreldbplus2.SAINT='10' AND
    usrelusproddoss.SAINT='10'
    ORDER BY
    usreldbplus1.ANR,
    usreldbplus1.IPOS

    L'erreur pointe vers le '=' des jointures

    Merci d'avance de m'aider !

    Kary-Boo

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut


    Sont placées bizarrement tes parenthèses... elles ne servent à rien et le OR n'est pas parenthésé.

    Tout dépend de ce que la requete doit ramener, mais le mieux pour la lisibilité c'est de placer des () autour du OR

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WHERE 
         usreldbplus1.ANR = usreldbplus2.ANR
    AND usreldbplus1.MNR = usrelac1.MNR(+) 
    AND usreldbplus1.MNR = usrelfirma1.FIRMANR(+) 
    AND usreldbplus1.UTNR = usrelac2.MNR(+) 
    AND usreldbplus1.DOSSIER = usrelusproddoss.DOSSIERNR(+) 
    AND ( usreldbplus1.SAINT='60' OR usreldbplus1.SAINT ='115')
    AND usreldbplus1.ANR NOT LIKE 'OF*' 
    AND usreldbplus2.ANRWS<>'60' 
    AND usreldbplus2.ANRWS<>'70' 
    AND usreldbplus2.ZDESC NOT LIKE 'ENTRÉ' 
    AND usreldbplus2.SAINT='10' 
    AND usrelusproddoss.SAINT='10'
    Ou
    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
     
    WHERE
    	( 
    		usreldbplus1.ANR = usreldbplus2.ANR
    	AND	usreldbplus1.MNR = usrelac1.MNR(+) 
    	AND	usreldbplus1.MNR = usrelfirma1.FIRMANR(+) 
    	AND usreldbplus1.UTNR = usrelac2.MNR(+) 
    	AND usreldbplus1.DOSSIER = usrelusproddoss.DOSSIERNR(+) 
    	AND usreldbplus1.SAINT='60'
    	)
     OR (
    		usreldbplus1.SAINT ='115'
    	AND usreldbplus1.ANR NOT LIKE 'OF*' 
    	AND usreldbplus2.ANRWS<>'60' 
    	AND usreldbplus2.ANRWS<>'70' 
    	AND usreldbplus2.ZDESC NOT LIKE 'ENTRÉ' 
    	AND usreldbplus2.SAINT='10' 
    	AND usrelusproddoss.SAINT='10'
    	)
    Si c'est le deuxième cas, fait un UNION ALL avec les 2 parties du WHERE

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Par défaut
    Merci de ta reponse super rapide. Au lieu de trop expliquer (et mal!), je prefère te soumettre la requete de base que je dois adapter sur Oracle 8i

    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
     
    SELECT 
    INFOR_USRELDBPLUS.SAINT AS INFOR_USRELDB_SAINT, INFOR_USRELDBPLUS.SAEXT, INFOR_USRELUSPRODDOSS.BEARBEITERKONSTR, INFOR_USRELUSPRODDOSS.CHBEARBEITERPROD, 
    INFOR_USRELDBPLUS.ANR, 
    INFOR_USRELDBPLUS.IPOS, 
    INFOR_USRELDBPLUS.DOSSIER, 
    INFOR_USRELDBPLUS.MNR, 
    INFOR_USRELAC.KTXT AS INFOR_USRELAC_KTXT, 
    INFOR_USRELFIRMA.NAME, 
    INFOR_USRELDBPLUS.KOMM, 
    INFOR_USRELDBPLUS.AGNR, 
    INFOR_USRELDBPLUS.KTXT AS INFOR_USRELDB_KTXT, INFOR_USRELDBPLUS.UTNR, 
    INFOR_USRELAC_1.KTXT AS INFOR_USRELAC_1_KTXT, 
    INFOR_USRELDBPLUS_1.ZUST, 
    INFOR_USRELDBPLUS_1.ANRWS, 
    INFOR_USRELDBPLUS_1.ZDESC, 
    INFOR_USRELDBPLUS.MENG_4, 
    INFOR_USRELDBPLUS.ME, 
    INFOR_USRELAC_1.ME AS ME_A, 
    INFOR_USRELDBPLUS.DAUER_4, 
    Left(INFOR_USRELDBPLUS_1!TERM_4,8) AS Del, 
    INFOR_USRELDBPLUS_1.LAGER, 
    INFOR_USRELUSPRODDOSS.DOSSIERKTXT
    FROM 
    ((((INFOR_USRELDBPLUS INNER JOIN INFOR_USRELDBPLUS AS INFOR_USRELDBPLUS_1 ON INFOR_USRELDBPLUS.ANR = INFOR_USRELDBPLUS_1.ANR) 
    LEFT JOIN INFOR_USRELAC ON INFOR_USRELDBPLUS.MNR = INFOR_USRELAC.MNR) 
    LEFT JOIN INFOR_USRELFIRMA ON INFOR_USRELDBPLUS.MNR = INFOR_USRELFIRMA.FIRMANR) 
    LEFT JOIN INFOR_USRELAC AS INFOR_USRELAC_1 ON INFOR_USRELDBPLUS.UTNR = INFOR_USRELAC_1.MNR) 
    LEFT JOIN INFOR_USRELUSPRODDOSS ON INFOR_USRELDBPLUS.DOSSIER = INFOR_USRELUSPRODDOSS.DOSSIERNR
    WHERE 
    ((
    (INFOR_USRELDBPLUS.SAINT)="60" Or (INFOR_USRELDBPLUS.SAINT)="115") AND 
    ((INFOR_USRELDBPLUS.ANR) Not Like "OF*") AND 
    ((INFOR_USRELDBPLUS_1.ANRWS)<>"60" And 
    (INFOR_USRELDBPLUS_1.ANRWS)<>"70") AND 
    ((INFOR_USRELDBPLUS_1.ZDESC) Not Like "ENTRÉ") AND ((INFOR_USRELDBPLUS_1.SAINT)="10") AND ((INFOR_USRELUSPRODDOSS.SAINT)="10"))
    ORDER BY 
    INFOR_USRELDBPLUS.ANR, 
    INFOR_USRELDBPLUS.IPOS
    WITH OWNERACCESS OPTION;
    Avec toute ces parenthèses c'est possible que je mèle le tout... car il faut en plus changer la syntaxe des "JOIN" par des (+) dans le where.. et là c'est le chaos dans ma tête....

    Merci d'essayer de me sortir du trou

    Kary-Boo

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    La 8i accepte déjà l'écriture ANSI ?

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

Discussions similaires

  1. probleme avec LEFT JOIN multi tables
    Par hinsano dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/07/2006, 06h36
  2. Réponses: 8
    Dernier message: 11/05/2006, 23h18
  3. LEFT JOIN sous Oracle 8i
    Par alexadvance dans le forum Oracle
    Réponses: 11
    Dernier message: 02/11/2005, 11h21
  4. [MySQL]probleme LEFT JOIN Mysql
    Par tatayoyo dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/08/2005, 20h47
  5. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38

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