Hello les copains
Pour simplifier, j’ai 2 tables dans une base MS SQL Server 2012: une avec des requêtes (pas sql :p) faites par des utilisateurs, et une avec les actions liées à ces requêtes. Cela vient d’un logiciel de service manager (genre pour les helpdesks):
Table REQUESTS Table ACTIONS
+------+-------+---+ +---------+------+--------+
|Req_ID|RFC_Num|...| |Action_ID|Req_ID|Group_ID|
+------+-------+---+ +---------+------+--------+
| 1 | I01 |...| | a | 1 | 10 |
+------+-------+---+ +---------+------+--------+
| 2 | I02 |...| | b | 1 | 20 |
+------+-------+---+ +---------+------+--------+
| 3 | I03 |...| | c | 1 | 38 |
+------+-------+---+ +---------+------+--------+
| 4 | I04 |...| | d | 1 | 38 |
+------+-------+---+ +---------+------+--------+
| e | 2 | 10 |
+---------+------+--------+
| f | 2 | 38 |
+---------+------+--------+
| g | 2 | 20 |
+---------+------+--------+
| h | 3 | 38 |
+---------+------+--------+
| i | 4 | 10 |
+---------+------+--------+
Je veux pouvoir sélectionner toutes les requêtes pour lesquelles la dernière action a comme group_id 38, donc avec les tables exemples le résultat serait les req_id = 1 et req_id = 3, car la dernière action pour ces requêtes a group_id =38, mais ça ne renverrait pas les req_id = 2 (car la dernière action est faite par un autre groupe) ni req_id = 4 (car c’est un autre groupe également)
J’ai essayé des trucs tels que
select *
from REQUEST r
inner join ACTION a
on (
(r.REQUEST_ID = a.REQUEST_ID )
and (select group_id
from ACTION a2
where a2.action_id = a.action_id
).GROUP_ID = 38
)
mais là je ne vois pas trop comment placer un “max(action_id)” (ou select top 1 with an order by desc) et je ne sais pas vraiment comme utiliser la clause HAVING qui aurait peut-être pu m’aider (sauf si je ne la comprends vraiment pas).
J’ai également essayé des requêtes comme celle-ci:
select *
from REQUEST r
inner join ACTION a
on (
(r.REQUEST_ID = a.REQUEST_ID )
and (select top 1 a2.action_id, a2.group_id
from ACTION a2
where a2.action_id = a.action_id
group by a2.ACTION_ID
order by a2.action_id desc
).GROUP_ID = 38
)
Mais j’obtiens 2 erreurs:
Msg 8120, Level 16, State 1, Line 6
La colonne ‘ACTION.GROUP_ID’ n’est pas valide dans la liste de sélection parce qu’elle n’est pas contenue dans une fonction d’agrégation ou dans la clause GROUP BY.
Msg 116, Level 16, State 1, Line 11
Une seule expression peut être spécifiée dans la liste de sélection quand la sous-requête n’est pas introduite par EXISTS.
ou encore
select *
from REQUEST r
inner join ACTION a on (r.REQUEST_ID = a.REQUEST_ID)
inner join ACTION a2 on (select top 1 a2.action_id, a2.group_id where a2.request_id = a.request_id order by a2.action_id desc).group_id = 38
Mais là encore j’ai une erreur car il ne veut pas du (select …).group_id = 38:
Une seule expression peut être spécifiée dans la liste de sélection quand la sous-requête n’est pas introduite par EXISTS.
Merci d’avance, je galère là