Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/05/2011, 15h51   #1
Invité de passage
 
Homme
Étudiant
Inscription : mai 2011
Messages : 4
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 : 4
Points : 3
Points : 3
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 :
IdPersonne - code_secteur - action - blabla
Ensuite, les actions sont identifiées par des identifiants dans une table de la structure :
Code :
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 :
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.
eat your potato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 16h05   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 16h34   #3
Invité de passage
 
Homme
Étudiant
Inscription : mai 2011
Messages : 4
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 : 4
Points : 3
Points : 3
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.
eat your potato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2011, 10h19   #4
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

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

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Utilises la clause Where Exists,

quelque chose du genre :
Code :
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.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 10h52   #5
Invité de passage
 
Homme
Étudiant
Inscription : mai 2011
Messages : 4
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 : 4
Points : 3
Points : 3
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 :
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
eat your potato est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h08.


 
 
 
 
Partenaires

Hébergement Web