OVH Cloud OVH Cloud

contraire d'une association

2 réponses
Avatar
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 ?

2 réponses

Avatar
Ph. B.
Alex Marandon wrote:

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 ?



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.
Avatar
Jacques Caron
On 16 Mar 2005 11:21:31 GMT, Alex Marandon
wrote:

SELECT * from groupe;
id | nom

SELECT * from personne;
id | nom

SELECT * from appartenance;
id_personne | id_groupe

Par contre comment faire pour récupérer les personnes qui
n'appartiennent _pas_ à un groupe donné ?



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/