select *
from
(select * from T where Action = 'SENT') s
left outer join
(select * from T where Action = 'RECEIVED') r
on r.Module and s.Module and r.User = s.User and r.Batch = s.Batch
A partir da quantidade limitada de dados de amostra, parece que você pode determinar exclusivamente uma correspondência tendo um
module
comum , user
e batch
. Não sei por que você apresentou duplicatas em suas consultas. O único outro problema parece estar usando uma junção externa para manter os "envios" que ainda não têm um "recebimento". Acho que você ainda queria tudo no resultado. Se você queria apenas os cenários não pareados, adicione:
where r.Module is null