SELECT DISTINCT u.UserName, ISNULL(ual.Status, 10) AS Status,
ISNULL(ual.ActiveDate, ISNULL(lg.CreateDate, '1970-01-01 00:00:00')) AS LastActive,
r.RoleName, ISNULL(ui.Avatar, ''), ISNULL(lg.Action, ''), ISNULL(at.Message, '')
FROM aspnet_Users AS u
INNER JOIN aspnet_UsersInRoles AS uir
ON uir.UserId = u.UserId
LEFT OUTER JOIN UserInfo AS ui
ON u.UserName = ui.UserName
LEFT OUTER JOIN UserActLog AS ual
ON ual.UserName = u.UserName
LEFT OUTER JOIN UserLog AS lg
ON lg.UserName = u.UserName
INNER JOIN ActionType AS at
ON at.Type = lg.Type
INNER JOIN aspnet_Roles AS r
ON r.RoleId = uir.RoleId
INNER JOIN aspnet_Membership as m
ON m.UserId = u.UserId
WHERE
(u.UserName LIKE '%'+@UserName+'%' OR @UserName = '') AND
(ISNULL(ual.ActiveDate, ISNULL(lg.CreateDate, '1970-01-01 00:00:00')) >= @LastActive or YEAR(@LastActive) = 1970) AND
(r.RoleName = @RoleName OR @RoleName = '')
ORDER BY u.UserName ASC
Jag vill enbart ha ut samma användarnamn(u.UserName) en gång. Som det är nu kommer det flera gånger. Det är kolumnerna lg.Action samt at.Message som 'ställer' till det.
Hur ska jag få det att det enbart visas en gång? Anv MSSQL.
Tack, har redan provat detta, och får felmeddelandet "Column ual.Status is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. ORDER BY items must appear in the select list if SELECT DISTINCT is specified".
Skulle iof gå att slå ihop de två sista kolumnerna, o sen splita de i koden, men är nog inte så optimalt, måste ju finnas nån lösning på det hela?
Eftersom du får flera Action och Message för varje användare så måste du bestämma vilken Action och Message du vill visa; är det det senaste Action resp. Message, eller spelar det kanske ingen roll? Om det inte spelar någon roll så behöver du ju inte ta med dessa kolumner i select-listan.
Ett alternativ annars är att göra en speciell vy i MS SQL som hämtar exakt det du vill hämta.
När man är inne på optimering så är det lätt att börja i fel ände, två subselects är i regel inget prestandaproblem.