2017-03-09 2 views
0

Essayant d'utiliser Distinct dans une instruction select mais n'obtenant pas le résultat souhaité. Je souhaite que CaseID soit renvoyé uniquement pour le dernier commentaire mis à jour. Voici la requête que j'essaie d'utiliser.utilisant distinct dans select ayant des jointures avec plusieurs tables

Select Distinct av.CaseID,fr.Rule_Description, av.Date, av.Status, fr.RULE_PRIORITY, ac.User_comments, max(ac.Comment_PostDate),ac.UserID 
From tblAlertView av 
Join tblAlertComment ac 
on av.CaseID = ac.CaseID 
Join tblFBLRule fr 
on av.RuleID = fr.Rule_ID 
Join TBLUSER usr 
on ac.UserID = usr.USERID 

group by av.CaseID, fr.Rule_Description, av.Date, av.Status, fr.RULE_PRIORITY, ac.User_comments, ac.Comment_PostDate,ac.UserID 

Query Result

+0

Lorsque vous utilisez le 'group by', vous n'avez pas besoin de' DISTINCT' dans l'instruction 'SELECT'. – Venu

Répondre

0

Retirer

ac.Comment_PostDate 

du groupe par la clause

0

Plutôt que d'utiliser JOIN pour se rendre à tblAlertComment, si vous utilisez CROSS APPLY vous pouvez spécifier pour revenir juste le top 1 commentaire par cause:

Supprimer la clause `ac.Comment_PostDate` de` group by`, car cela vous donnera des résultats multiples et l'agrégation `MAX()` ne fonctionnera pas comme prévu. 0
SELECT av.CaseID, 
     fr.Rule_Description, 
     av.Date, 
     av.Status, 
     fr.RULE_PRIORITY, 
     ac.User_comments, 
     ac.Comment_PostDate, 
     ac.UserID 
FROM tblAlertView AS av 
     INNER JOIN tblFBLRule AS fr 
      ON av.RuleID = fr.Rule_ID 
     CROSS APPLY 
     ( SELECT TOP 1 ac.User_comments, ac.Comment_PostDate, ac.UserID 
      FROM tblAlertComment AS ac 
        INNER JOIN tblUser AS usr 
         ON usr.UserID = ac.UserID 
      WHERE ac.CaseID = av.CaseID 
      ORDER BY ac.Comment_PostDate DESC 
     ) AS ac;