webForumDet fria alternativet

Problem med DISTINCT i en sök fråga

Databaser & SQL

12 svar · 1 758 visningar · startad av Vinnaren

Medlem sedan sep. 2005833 inlägg
Frågan#1

Hej!

Har följande:

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.

Tacksam för all hjälp :stud

Medlem sedan mars 20007 896 inlägg
#2
...
group by
   u.UserName
order by
   u.UserName asc
Medlem sedan sep. 2005833 inlägg
#3

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? :q

Medlem sedan dec. 20025 483 inlägg
#4

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.

Medlem sedan sep. 2005833 inlägg
#5

Ja, det är den senaste lg.Action som jag vill ha ut, at.Message är typnamnet till lg.Action. :stud

Medlem sedan juni 20003 076 inlägg
#6

Gör en subselect vetja! :)

Medlem sedan sep. 2005833 inlägg
#7

mjo, har funderat på det. Men den kan enbart returnera ett värde? Vill ju ha ut både at.Message och lg.Action.

Medlem sedan juni 20003 076 inlägg
#8

Visst är det så och därför gör du två subselects! :)

Medlem sedan sep. 2005833 inlägg
#9

Är det bättre än o slå ihop två kolumner till en, o sen köra split på dessa för att få ut bägge? :i :q (prestandamässigt )

Medlem sedan juni 20003 076 inlägg
#10

Krångla inte till det! ;)
http://en.wikipedia.org/wiki/KISS_principle

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.

Medlem sedan sep. 2005833 inlägg
#11

Haha, jo, det har du nog rätt i. Tack, får köra på det ;)

Ett annat litet problem jag har med samma sql fråga är TOP. Jag skickar in hur många rader jag vill ha från SP. Men hur skriver jag detta?

Har provat med:

SELECT DISTINCT TOP @Unit u.UserName .....

Men får felmeddelandet "incorrect syntax near '@Unit'"
:r

Medlem sedan dec. 20025 483 inlägg
#12

TOP (@Unit)

Medlem sedan sep. 2005833 inlägg
#13

aha, givetvis, tack :bire

648 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
362 ms — deklarationer (db)
0 ms — hämta statistik (cache)
279 ms — hämta tråd, inlägg och bilagor (db)
364 ms — ändringar (db)