Avatar billede jmp.dk Nybegynder
05. juli 2010 - 13:57 Der er 1 kommentar

Optimal query

I have 2 tables

1) CLIENTS (ID int IDENTITY, NAME varchar(250)
2) CLIENT_LOG( CLIENT_ID INT, DATE datetime )

Every time the client is selected in the system a row is put into the client_log.

Now i need to create a view showing the last 30 clients selected.

I currently use: select top 30 c.id, c.name from clients c join client_log l on l.client_id = c.id  order by l.date desc

Only problem this is giving duplications if a client has been slected more than once in the last 30.

There are millions of records in each table so I need something pretty fast.

Thanks

Jonas
Avatar billede Syska Mester
05. juli 2010 - 14:21 #1
Så du vil kun have sidste log entry for hver klient.

SELECT * FROM Log L1
INNER JOIN
(SELECT TOP 30 MAX(LogID) FROM Log L
GROUP BY ClientID) AS L2
ON L1.LogID = L2.LogID
INNER JOIN Clients C ON C.ClintID = L1.ClientID

Ingen ide om hvordan der performer ... men problemet er at du kun vil have en row ... per user, hvis du vil have performance, ville jeg oprette en column i din clienttable, som angiver ID'et på den sidst indsatte row i din log table, og sørge for at du har de rigtige indexes.

mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester