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.
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.
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
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');
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.
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/
On 16 Mar 2005 11:21:31 GMT, Alex Marandon <al@ENLEVER_CECIalpage.org>
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/