Bonjour à tous !!
Je viens d'écrire une requête, qui fonctionne correctement (i.e, elle me renvoie bien les lignes attendues), houra !
Mais je me demandais, par simple curiosité, si c'est la meilleure façon de faire, et sinon, comment feriez vous??
Allez, maintenant, je présente les choses :
Le but de la requête : pour chaque groupe (RF_ID, CHAIN_ID) de la table T_CAL (ainsi que pour un autre filtre dans le WHERE), je veux conserver uniquement les CAL_ID de telle sorte que ces CAL_ID ne soit pas le minimum pour ce groupe (RF_ID, CHAIN_ID) là.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 table T_CAL ( CAL_ID SMALLINT NOT NULL PRIMARY KEY AUTO_INCREMENT, CALTYP_ID SMALLINT NOT NULL REFERENCES T_CAL_TYPE(CALTYP_ID), RF_ID SMALLINT NULL, CHAIN_ID SMALLINT NULL ); T_CAL_TYPE ( CALTYP_ID SMALLINT NOT NULL PRIMARY KEY AUTO_INCREMENT, CALTYP_NAME VARCHAR(40) NOT NULL ) Y'a d'autres colonnes sur ces 2 tables, mais on s'en tamponne :)
Exemple (des lignes de la table T_CAL):
Le résultat que j'attends :1 - 1 - 2
2 - 1 - 1
3 - 1 - 2
4 - 1 - 2
5 - 1 - 1
Maintenant voici ma requête :3 - 1 - 2
4 - 1 - 2
5 - 1 - 1
Cette requête fait bien ce que j'attends, mais est ce qu'il y'a plus simple? plus optimisé? Comment auriez vous fait?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SELECT cal1.cal_id FROM t_cal cal1 INNER JOIN t_cal_type ty ON ty.caltyp_id = cal1.caltyp_id LEFT OUTER JOIN (SELECT min(cal.cal_id) as minB FROM t_cal cal INNER JOIN t_cal_type type1 ON type1.caltyp_id = cal.caltyp_id WHERE type1.CALTYP_NAME='RCHAIN' GROUP BY cal.rf_id, cal.chain_id) as te ON minB = cal1.cal_id WHERE ty.caltyp_name='RCHAIN' AND minB IS NULL
D'avance, je vous dis bien merci ! !
Mickaël.
Partager