Bonjour,
J'ai une question à propos de la technique mise en place pour faire une division relationnelle.
Supposons que j'ai les deux tables suivantes :
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 CREATE TABLE categorie ( id INT NOT NULL PRIMARY KEY, nom VARCHAR(45) );
Avec les données suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 CREATE TABLE objet ( id INT NOT NULL PRIMARY KEY, id_categ INT FOREIGN KEY REFERENCES categorie (id), taille SMALLINT );
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 INSERT INTO categorie VALUES (1, 'categorie1'); INSERT INTO categorie VALUES (2, 'categorie2'); INSERT INTO categorie VALUES (3, 'categorie3'); INSERT INTO categorie VALUES (4, 'categorie4');
Maintenant, je souhaite les deux plus gros objets de chaque catégorie. Je fais ça par une division relationnelle, comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 INSERT INTO objet VALUES (1, 1, 10); INSERT INTO objet VALUES (2, 1, 11); INSERT INTO objet VALUES (3, 1, 9); INSERT INTO objet VALUES (4, 1, 5); INSERT INTO objet VALUES (5, 2, 6); INSERT INTO objet VALUES (6, 2, 8); INSERT INTO objet VALUES (7, 2, 6); INSERT INTO objet VALUES (8, 2, 4); INSERT INTO objet VALUES (9, 3, 5); INSERT INTO objet VALUES (10, 4, 8); INSERT INTO objet VALUES (11, 4, 10); INSERT INTO objet VALUES (12, 4, 12); INSERT INTO objet VALUES (13, 4, 10);
Comme on peut le voir, on obtient bien 2 objets de la catégorie 1, un seul de la catégorie 3 (le seul de cette catégorie), mais 3 objets pour les catégories 2 et 4. Cela est dû au fait qu'il y a des objets de même taille (la deuxième plus grande taille dans ces catégories).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT o.id, c.nom, o.taille FROM objet o INNER JOIN categorie c ON o.id_categ = c.id WHERE (SELECT COUNT(*) FROM objet o2 WHERE o.id_categ = o2.id_categ AND o.taille < o2.taille) < 2 ORDER BY o.id
Ma question est la suivante : dans les catégories 2 et 4, comment faire pour ne ramener qu'un seul des objets en double (par exemple celui qui a le plus petit id) ?
Merci d'avance de votre aide,
ced
Partager