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 :

Autojointure + jointure externe


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mai 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 22
    Par défaut Autojointure + jointure externe
    Bonjour,

    J ai la table emp d oracle ,



    Nom : Capturetableemp.JPG
Affichages : 1360
Taille : 314,3 Ko



    Je dois trouver les employés qui n 'ont pas de suboordonnée (qui ne sont chefs de personne)

    Je n'arrive pas a visualiser la chose ,et a trouver les résultats , ma requete me renvoie que des null

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     
    select e.ename , e.deptno from emp e, emp e1
     
    where e.mgr (+)= e1.empno 
     
    and e.empno is null

    merci

  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
    fais un SELECT e.*, e1.* pour comprendre ton erreur.

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    En tout cas le résultat de la requête est bien conforme à la requête elle-même

  4. #4
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mai 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 22
    Par défaut
    les emp n ayant pas de manager se trouvent du coté de la table e1 et je ne comprends pas pourquoi

  5. #5
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    Citation Envoyé par azzimu Voir le message
    les emp n ayant pas de manager se trouvent du coté de la table e1 et je ne comprends pas pourquoi
    Regarde comment tu utilises le (+).
    Citation Envoyé par shaun_the_sheep Voir le message
    J'ai solutionné mon problème avec un LEFT OUTER JOIN en lieu et place d'une jointure avec (+)

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from emp e, emp e1
    where e.mgr (+)= e1.empno 
    and e.empno is null
    where e.mgr (+)= e1.empno
    Le (+) indique la table qui peut ne pas avoir de données

    Donc tu prends toutes les lignes de E1, tu lies avec les lignes de la table E pour laquelle il existe une affectation mgr = ton numéro de empno

    Tes alias ne sont pas top pour la compréhension

    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT m.*, e.*
    FROM EMP m, EMP e 
    WHERE m.empno = e.mgr (+) 
    ORDER BY m.empno, e.empno
    Ce sera plus compréhensible peut être : Voici la liste de tous les employés avec les employés sous leurs ordre (= dont ils sont manager)
    m= manager
    s= employé

    En reprenant tes données :

    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
    WITH emp AS (SELECT 7369 empno, 'SMITH' ename, 7902 mgr FROM dual
    UNION ALL SELECT 4799 empno, 'ALLEN' ename, 7698 mgr FROM dual
    UNION ALL SELECT 7521 empno, 'WARD' ename, 7698 mgr FROM dual
    UNION ALL SELECT 7566 empno, 'JONES' ename, 7839 mgr FROM dual
    UNION ALL SELECT 7654 empno, 'MARTIN' ename, 7698 mgr FROM dual
    UNION ALL SELECT 7698 empno, 'BLAKE' ename, 7839 mgr FROM dual
    UNION ALL SELECT 7782 empno, 'CLARK' ename, 7839 mgr FROM dual
    UNION ALL SELECT 7788 empno, 'SCOTT' ename, 7566 mgr FROM dual
    UNION ALL SELECT 7839 empno, 'KING' ename, NULL mgr FROM dual
    UNION ALL SELECT 7844 empno, 'TURNER' ename, 7698 mgr FROM dual
    UNION ALL SELECT 7876 empno, 'ADAMS' ename, 7788 mgr FROM dual
    UNION ALL SELECT 7900 empno, 'JAMES' ename, 7698 mgr FROM dual
    UNION ALL SELECT 7902 empno, 'FORD' ename, 7566 mgr FROM dual
    UNION ALL SELECT 7937 empno, 'MILLER' ename, 7782 mgr FROM dual)
    SELECT m.*, e.*
    FROM EMP m, EMP e 
    WHERE m.empno = e.mgr (+) 
    ORDER BY m.empno, e.empno
    Ca te donne
    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
    EMPNO	ENAME	MGR	EMPNO_1	ENAME_1	MGR_1
    4799	ALLEN	7698			
    7369	SMITH	7902			
    7521	WARD	7698			
    7566	JONES	7839	7788	SCOTT	7566
    7566	JONES	7839	7902	FORD	7566
    7654	MARTIN	7698			
    7698	BLAKE	7839	4799	ALLEN	7698
    7698	BLAKE	7839	7521	WARD	7698
    7698	BLAKE	7839	7654	MARTIN	7698
    7698	BLAKE	7839	7844	TURNER	7698
    7698	BLAKE	7839	7900	JAMES	7698
    7782	CLARK	7839	7937	MILLER	7782
    7788	SCOTT	7566	7876	ADAMS	7788
    7839	KING		7566	JONES	7839
    7839	KING		7698	BLAKE	7839
    7839	KING		7782	CLARK	7839
    7844	TURNER	7698			
    7876	ADAMS	7788			
    7900	JAMES	7698			
    7902	FORD	7566	7369	SMITH	7902
    7937	MILLER	7782
    Suffit que tu rajoutes ta condition (le manager n'a aucun employé sous ses ordres) : AND e.empno IS NULL
    et tu as bien ta liste avec les m.*

    Tu peux aussi faire ceci (plus compréhensible pour les humains) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT m.*
    FROM EMP m
    WHERE NOT EXISTS (SELECT 1 FROM EMP e WHERE e.mgr = m.empno)

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Bonsoir,

    Les données du bon vieux schéma scott sont toujours utiles pour se former

    Puisque le sujet est vraisemblablement une introduction au parcours d'arbre, je te conseille de chercher la doc sur CONNECT BY.
    En jouant avec une conditionnelle sur la pseudo colonne LEVEL tu pourras arrêter le parcours d'arbre à la génération voulue.

    Une solution alternative est de structurer ses données pour l'algorithme de "parcours intervallaire" de SQLpro (à trouver sur ce site)

    Par la suite, il faudra s'attaquer à la récursivité pure (au delà des parcours d'arbre) avec les CTE.

Discussions similaires

  1. Jointure Externe et autojointure
    Par _pepito_ dans le forum Designer
    Réponses: 3
    Dernier message: 17/01/2011, 11h14
  2. [Designer 5.1.6] : jointure externe et autojointure
    Par tux2005 dans le forum Designer
    Réponses: 2
    Dernier message: 12/12/2008, 15h48
  3. Requete autojointure ou jointure externe
    Par Amras45 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/05/2008, 12h00
  4. [ jointure externe ] j'y pompe rien
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2003, 17h57
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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