Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 17/11/2011, 12h48   #1
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Par défaut Requête possible avec une jointure ?

Bonjour,
je bloque sur une requête et je me demande si au final le résultat que je cherche à obtenir est possible avec uniquement une jointure.
J'ai réduit le problème aux 2 tables suivantes :

Code :
1
2
bag_documents
d_id | d_titre
et :

Code :
1
2
bag_j_personnes_documents
d_id | p_id
La table 'bag_j_personnes_documents' est une "table de jointure" me permettant de relier des id de personnes 'p_id' à des documents 'd_id'.

Je cherche à faire une requête me permettant de récupérer tous les documents liés à une personne mais en même temps pour chaque document retourné, j'aurais besoin d'avoir les autres personnes qui lui sont liées.

Exemple avec un jeu de données :

Code :
1
2
3
bag_documents
d_id	| d_titre
1	| un titre
Code :
1
2
3
4
5
bag_j_personnes_documents
d_id	| p_id
1	| 11
1	| 15
1	| 25
Voici ma requête actuelle :

Code :
1
2
3
4
5
SELECT bag_documents.d_id, bag_documents.d_titre, bag_j_personnes_documents.*
FROM bag_documents
INNER JOIN bag_j_personnes_documents
	ON bag_j_personnes_documents.d_id = bag_documents.d_id
WHERE bag_j_personnes_documents.p_id = '11'
qui ne me retourne bien sûr qu'un seul résultat :

Code :
1
2
3
 
d_id	| d_titre	| p_id	| d_id
1	| un titre	| 11	| 1
Pensez-vous qu'il soit possible d'obtenir ceci :

Code :
1
2
3
4
5
 
d_id	| d_titre	| p_id	| d_id
1	| un titre	| 11	| 1
1	| un titre	| 15	| 1
1	| un titre	| 25	| 1
avec une seule jointure et en gardant comme table de base du SELECT la table 'bag_documents' ? Je pensais à la base à une jointure externe sur la première table mais aucun de mes essais n'a été concluant.

En vous remerciant d'avance pour les informations.
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 12h57   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 641
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 641
Points : 2 634
Points : 2 634
bonjour,

oui une approche avec une jointure externe serai de mon point de vu une solution.


Quelle requête avez vous essayé ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 13h15   #3
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Bonjour, et merci.
J'ai essayé les jointures gauche, puis droite :
Code :
1
2
3
4
5
 
SELECT bag_documents.d_id, bag_documents.d_titre, bag_j_personnes_documents.*
FROM bag_documents
LEFT OUTER JOIN bag_j_personnes_documents ON bag_j_personnes_documents.d_id = bag_documents.d_id
WHERE bag_j_personnes_documents.p_id = '11'
Code :
1
2
3
4
SELECT bag_documents.d_id, bag_documents.d_titre, bag_j_personnes_documents.*
FROM bag_documents
RIGHT OUTER JOIN bag_j_personnes_documents ON bag_j_personnes_documents.d_id = bag_documents.d_id
WHERE bag_j_personnes_documents.p_id = '11'
qui retournent toutes deux exactement le même résultat :

Code :
1
2
d_id	| d_titre	| p_id	| d_id
1	| un titre	| 11	| 1
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 13h19   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 641
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 641
Points : 2 634
Points : 2 634
oki,

En fait il vous manque un nivaeu de jointure.

En y réfléchissant un peu plus la jointure externe n'est pas nécessaire.


Voilà deux pistes pour votre besoin :
Code :
1
2
3
4
5
6
 
SELECT b.*, c.* 
FROM doc_per a
INNER JOIN doc b ON a.d_id = b.d_id
INNER JOIN doc_per c ON a.d_id = c.d_id
WHERE a.p_id = 11;

Code :
1
2
3
4
5
 
SELECT * 
FROM doc_per a
INNER JOIN doc b ON a.d_id = b.d_id
WHERE EXISTS (SELECT NULL FROM doc_per c WHERE c.p_id = 11 AND c.d_id = b.d_id);
doc_per : bag_j_personnes_documents
doc : bag_documents
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/11/2011, 13h55   #5
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Merci beaucoup, cela fonctionne en effet. Je suis resté sur la table 'bag_documents' en tant que première table, ce qui donne :

Code :
1
2
3
4
5
SELECT bag_documents.d_id, bag_documents.d_titre, c.* 
FROM bag_documents
INNER JOIN bag_j_personnes_documents ON bag_j_personnes_documents.d_id = bag_documents.d_id
INNER JOIN bag_j_personnes_documents c ON bag_j_personnes_documents.d_id = c.d_id
WHERE bag_j_personnes_documents.p_id = 11;
On a donc une auto-jointure, je n'y avais pas pensé.
Encore merci
__________________
Vive les roues en pierre
Djakisback 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 08h16.


 
 
 
 
Partenaires

Hébergement Web