contraire d'une association
Le
Alex Marandon
Bonjour,
Je cherche à récupérer sous PostgreSQL des enregistrement qui ne sont
pas associés à un autre enregistrement.
Exemple :
SELECT * from groupe;
id | nom
-+--
9 | scorn
10 | napalm death
11 | beatles
12 | wailers
SELECT * from personne;
id | nom
-+-
1 | mick harris
2 | ringo star
3 | john lennon
4 | peter tosh
5 | bob marley
SELECT * from appartenance;
id_personne | id_groupe
-+--
1 | 9
1 | 10
2 | 11
3 | 11
4 | 12
5 | 12
Je n'ai pas de problème pour récupérer les personnes qui appartiennent à
un groupe ou les groupes qui comportent une personne donnée.
Par exemple pour avoir les membres des 'beatles' je fais :
SELECT personne.nom FROM personne
INNER JOIN appartenance ON (personne.id = appartenance.id_personne)
INNER JOIN groupe ON (groupe.id = appartenance.id_groupe)
WHERE groupe.nom = 'beatles';
En encore pour savoir à quels groupes appartient 'mick harris' :
SELECT groupe.nom FROM groupe
INNER join appartenance ON (groupe.id = appartenance.id_groupe)
INNER join personne ON (personne.id = appartenance.id_personne)
WHERE personne.nom = 'mick harris';
Par contre comment faire pour récupérer les personnes qui
n'appartiennent _pas_ à un groupe donné ?
J'ai naïvement essayé quelque chose comme :
SELECT personne.nom FROM personne
INNER JOIN appartenance ON (personne.id = appartenance.id_personne)
INNER JOIN groupe ON (groupe.id = appartenance.id_groupe)
WHERE groupe.nom != 'beatles';
Mais ça ne va pas bien sûr. Les personnes sont comptées pour tous les
groupes auxquelles elles appartiennent, sauf celui concerné par
l'inégalité spécifiée.
Une idée ?
Je cherche à récupérer sous PostgreSQL des enregistrement qui ne sont
pas associés à un autre enregistrement.
Exemple :
SELECT * from groupe;
id | nom
-+--
9 | scorn
10 | napalm death
11 | beatles
12 | wailers
SELECT * from personne;
id | nom
-+-
1 | mick harris
2 | ringo star
3 | john lennon
4 | peter tosh
5 | bob marley
SELECT * from appartenance;
id_personne | id_groupe
-+--
1 | 9
1 | 10
2 | 11
3 | 11
4 | 12
5 | 12
Je n'ai pas de problème pour récupérer les personnes qui appartiennent à
un groupe ou les groupes qui comportent une personne donnée.
Par exemple pour avoir les membres des 'beatles' je fais :
SELECT personne.nom FROM personne
INNER JOIN appartenance ON (personne.id = appartenance.id_personne)
INNER JOIN groupe ON (groupe.id = appartenance.id_groupe)
WHERE groupe.nom = 'beatles';
En encore pour savoir à quels groupes appartient 'mick harris' :
SELECT groupe.nom FROM groupe
INNER join appartenance ON (groupe.id = appartenance.id_groupe)
INNER join personne ON (personne.id = appartenance.id_personne)
WHERE personne.nom = 'mick harris';
Par contre comment faire pour récupérer les personnes qui
n'appartiennent _pas_ à un groupe donné ?
J'ai naïvement essayé quelque chose comme :
SELECT personne.nom FROM personne
INNER JOIN appartenance ON (personne.id = appartenance.id_personne)
INNER JOIN groupe ON (groupe.id = appartenance.id_groupe)
WHERE groupe.nom != 'beatles';
Mais ça ne va pas bien sûr. Les personnes sont comptées pour tous les
groupes auxquelles elles appartiennent, sauf celui concerné par
l'inégalité spécifiée.
Une idée ?

Poser une question


Par exemple:
SELECT personne.nom
FROM personne
WHERE personne.id NOT IN
(SELECT appartenance.id_personne
FROM appartenance
INNER JOIN groupe ON groupe.id = appartenance.id_GROUPE
WHERE groupe.nom = 'beatles');
--
Philippe.
Je dirais:
SELECT nom FROM personne WHERE id NOT IN (SELECT id_personne FROM
appartenance WHERE id_groupe = x)
ou
SELECT nom FROM personne WHERE id IN (SELECT id_personne FROM appartenance
WHERE id_groupe <> x)
Sinon tu peux regarder du côté de SELECT (la liste de tout le monde)
EXCEPT (SELECT (la liste de ceux qui sont dans le groupe)).
Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/