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 :

Jointures entre trois tables


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 15
    Points
    15
    Par défaut Jointures entre trois tables
    Bonjour

    J'ai plusieurs requêtes à faire sur une base de données Oracle (logique vu la catégorie du forum me diriez-vous) ; j'ai réussi à traiter toutes les requêtes sauf une où je sèche un peu.
    Je vais essayer de syntétiser la base pour vous expliquer le problème. Le but du jeu est de trouver des personnes ayant des tâches incompatibles.
    Il y a d'abord une table où il y a des actions faites par des personnes, de structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IdPersonne - code_secteur - action - blabla
    Ensuite, les actions sont identifiées par des identifiants dans une table de la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code_secteur - action - code_tache
    Enfin, les tâches incompatibles sont renseignées dans une table sans hiérarchie (les codes tache sont des numéros) de la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code_tache1 - code_tache2
    Donc il faut que j'utilise ces tables là pour déterminer les personnes possédant des taches incompatibles.
    Je suis capable de récupérer les informations sur les personnes possédant des tâches qui sont répertoriées dans la table "tâche incompatible" mais je ne sais pas comment lier ça pour obtenir les personnes ayant des tâches incompatible.
    Eventuellement, il est possible de retoucher les tables "identifiant tâche" et "tâche incompatibles" mais je n'ai pas d'idée pour une autre organisation.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par eat your potato Voir le message
    Je suis capable de récupérer les informations sur les personnes possédant des tâches qui sont répertoriées dans la table "tâche incompatible" mais je ne sais pas comment lier ça pour obtenir les personnes ayant des tâches incompatible.
    Euh... j'ai pas compris où les personnes ayant des taches incompatibles c'est la même chose que les personnes dont les taches sont dans tache incompatible ? T'as répondu au problème en fait

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 15
    Points
    15
    Par défaut
    Non, je me suis mal exprimé. Voici un exemple de ce qu'il pourrait y avoir :
    - Dans la table des actions :
    toto01 -- rdc -- technicien de surface
    toto01 -- rdc -- inspecteur propreté
    tata02 -- lv1 -- agent expert
    toto01 -- lv1 -- technicien de surface
    toto01 -- lv1 -- inspecteur propreté
    titi003 -- rdc -- secrétaire

    - Dans la table des tâches :
    rdc --- technicien de surface -- 1
    rdc --- inspecteur propreté -- 2
    lv1 --- agent expert -- 3
    lv1 --- technicien de surface -- 4
    lv1 --- inspecteur propreté -- 5
    rdc --- agent expert -- 6

    - Dans la table des tâches incompatibles
    1 -- 2
    4 -- 5
    3 -- 8

    En fait, je suis capable de récupérer les personnes possédant au moins une tâche potentiellement incompatible (en gros, si la tâche se trouve dans n'importe quelle colonne de la table "tâches incompatibles") mais après je ne trouve pas comment faire la liaison pour voir s'il possède aussi la tâche incompatible qui est liée.
    En gros, pour l'instant ma requête ramène comme personne toto01 et tata02 alors qu'il faudrait uniquement toto01 comme résultat.
    Je ne sais pas si c'est plus clair comme ça.

  4. #4
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,

    Utilises la clause Where Exists,

    quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct nom from (select nom, tache from jointure1 where exists (select nom, tache from jointure2 where jointure1.nom=jointure2.nom and jointure1.tache<>jointure2.tache))

    Ce que j'ai appelé jointure correspond à la même requête qui récupère le nom de la personne et la tâche incompatible.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 15
    Points
    15
    Par défaut
    Merci pour l'idée de prendre comme table le résultat de ma requête de sélection, ça m'a débloqué et je pense avoir trouvé la bonne solution.

    Pour ceux que ça intéresse, ma requête est de la forme :

    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
     
    SELECT DISTINCT *
               FROM (f.code_tache, c1.nomprenom,
                            c1.code_secteur, c1.action, t.code_tache2
                       FROM o_personne c1 JOIN o_tache_fonctionnelle f
                            ON f.code_secteur = c1.code_secteur
                          AND c1.action = f.action
                            JOIN o_tache_incompatible t
                            ON f.code_tache = t.code_tache1
                            ) p1
                    JOIN
                    (SELECT f.code_tache, c1.nomprenom,
                            c1.code_secteur, c1.action
                       FROM o_personne c1 JOIN o_tache_fonctionnelle f
                            ON f.code_secteur = c1.code_secteur
                          AND c1.action = f.action
                            JOIN o_tache_incompatible t
                            ON f.code_tache = t.code_tache2
                            ) p2
                    ON p1.nomprenom = p2.nomprenom
                  AND p1.code_tache2 = p2.code_tache

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

Discussions similaires

  1. Jointure entre trois tables via SQL Developer
    Par mam51100 dans le forum Oracle
    Réponses: 4
    Dernier message: 25/01/2014, 10h20
  2. Réponses: 3
    Dernier message: 20/09/2013, 10h07
  3. [AC-2010] Formulaire - Jointure relationnelle entre trois tables
    Par arkham55 dans le forum IHM
    Réponses: 2
    Dernier message: 20/12/2012, 14h02
  4. Réponses: 8
    Dernier message: 20/05/2012, 15h19
  5. Jointure entre trois tables
    Par bili31 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 26/01/2012, 20h09

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