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 :

Jointure externe avec upper


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Par défaut Jointure externe avec upper
    Bonjour ,

    Je souhaite effectuer la jointure externe suivante avec upper.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> Select E.EMPNO, E.ENAME, M.ENAME, D.LOC
    from EMP E, EMP M, DEPT D
    where E.MGR = M.EMPNO (+)
    and E.DEPTNO = D.DEPTNO;
    mais ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> Select E.EMPNO, E.ENAME, M.ENAME, D.LOC
    from EMP E, EMP M, DEPT D
    where upper(E.MGR) = upper(M.EMPNO) (+)
    and E.DEPTNO = D.DEPTNO;
    ne fonctionne pas , pourquoi ?
    Existe-il une astuce pour que cela fonctionne sans utiliser
    OUTER RIGHT JOIN ?

    Merci.

  2. #2
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2009
    Messages : 447
    Par défaut
    pourquoi vous allez utiliser la fonction UPPER pour un champs de type nombre !!
    ça sert à quoi !!
    sur quelle version d'oracle tu travailles !!

    bon essaye ça ,je l'ai testé avec 10g et ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select e.empno,e.ename as "employee",m.ename as "manager",loc
    from emp e left outer join emp m
    on(upper(e.mgr)=upper(m.empno))
    join (dept)
    on(e.deptno=dept.deptno)
    /
    ça donne aussi avec full outer join .

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Par défaut
    version oracle 11gR2

    Désolé , avez-vous bien lu ma question avec ses subtilités en rouge !

    Sinon ce n'est parce que le champ s'appelle EMPNO qu'il est numérique ...

    Merci quand même !

  4. #4
    Expert confirmé 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
    Par défaut
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> Select E.EMPNO, E.ENAME, M.ENAME, D.LOC
      2  from EMP E, EMP M, DEPT D
      3  where upper(E.MGR) = upper(M.EMPNO(+))
      4  and E.DEPTNO = D.DEPTNO;
     
    EMPNO ENAME      ENAME      LOC
    ----- ---------- ---------- -------------
     7902 FORD       JONES      DALLAS
     7788 SCOTT      JONES      DALLAS
     7900 JAMES      BLAKE      CHICAGO
     7844 TURNER     BLAKE      CHICAGO
     7654 MARTIN     BLAKE      CHICAGO
     7521 WARD       BLAKE      CHICAGO
     7499 ALLEN      BLAKE      CHICAGO
     7934 MILLER     CLARK      NEW YORK
     7876 ADAMS      SCOTT      DALLAS
     7698 BLAKE      KING       CHICAGO
     7566 JONES      KING       DALLAS
     7782 CLARK      KING       NEW YORK
     7369 SMITH      FORD       DALLAS
     7839 KING                  NEW YORK
     
    14 rows selected

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par tropiko Voir le message
    Existe-il une astuce pour que cela fonctionne sans utiliser
    OUTER RIGHT JOIN ?
    Par curiosité, quel intérêt de vouloir éviter la syntaxe SQL:92 ?
    Au passage c'est RIGHT OUTER JOIN, OUTER étant facultatif.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Par curiosité, quel intérêt de vouloir éviter la syntaxe SQL:92 ?
    Au passage c'est RIGHT OUTER JOIN, OUTER étant facultatif.

    Ceci est imposé par mon Client qui ne veut pas de cette syntaxe dans son code ...
    Le Client est ROI

    Merci à vous tous et surtout à Mnitu qui a la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE upper(E.MGR) = upper(M.EMPNO(+))
    J'avais fait une erreur d syntaxe ... le (+) doit être à l’intérieur du upper !

    A+

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par tropiko Voir le message
    Ceci est imposé par mon Client qui ne veut pas de cette syntaxe dans son code ...
    Le Client est ROI
    Mais c'est le devoir du consultant de lui expliquer :
    1. Quand il a tort, comme c'est le cas ici. Le principe du devoir de conseil.
    2. Que de toute façon, il ne devrait pas se mêler de l'expertise technique : s'il embauche du monde pour le faire, c'est bien parce qu'il ne l'a pas.

  8. #8
    Expert confirmé 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
    Par défaut
    Les choses peuvent être un peu plus nuancées :
    1. Il y a eu (a encore) un certain nombre des bugs spécifiques à la syntaxe ANSI.
    2. Un conseiller vient et repart. Si les développeurs ne se sont pas familiarisés avec la syntaxe ANSI il leur sera plus difficile de maintenir le code.
    3. Les requêtes AINSI sont transformées par Oracle à sa sauce (non ANSI).

  9. #9
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Les choses peuvent être un peu plus nuancées :
    1. Il y a eu (a encore) un certain nombre des bugs spécifiques à la syntaxe ANSI.
    2. Un conseiller vient et repart. Si les développeurs ne se sont pas familiarisés avec la syntaxe ANSI il leur sera plus difficile de maintenir le code.
    3. Les requêtes AINSI sont transformées par Oracle à sa sauce (non ANSI).
    1. C'est quand même de moins en moins vrai ; en outre, les bugs sont relativement bien identifiés, quand même. Mais sur ce point là, admettons.
    2. Là par contre on a aussi le contraire ; et plus ça va, plus ça sera dans l'autre sens que le risque de quelqu'un qui n'est pas familier avec les jointures externes sous forme de (+) mis de façon non intuitive compliquera la maintenance du code (cf ce post !).
    3. Oui mais ça c'est du domaine interne, l'important c'est bien l'écriture de la requête par le développeur.

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

Discussions similaires

  1. Jointure externe avec constante
    Par magic charly dans le forum SQL
    Réponses: 2
    Dernier message: 02/05/2007, 10h37
  2. Jointure externe avec prédicat dans la clause de jointure
    Par aflp91 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 08/12/2006, 00h23
  3. Pb de jointure externe avec un number
    Par mch_27 dans le forum Oracle
    Réponses: 2
    Dernier message: 07/03/2006, 15h33
  4. [SQL] jointure externe avec 3 tables, comment faire ....
    Par grumbok dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 16h13
  5. jointure externe avec un where, me pose problème!
    Par Danae dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/07/2005, 17h37

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