2012-10-12 40 views
2

我在這個上得到一個快速的sql查詢有點麻煩。我設法得到一個查詢來返回我想要的結果,但即使使用正確的索引,也需要大約2秒的時間才能運行。與深入加入的t-sql查詢

我有這些表:

[Login] 
loginID 
loginTime 
userID 

[user] 
userID 
userName 

[companyParticipant] 
userID 
companyID 

[company] 
companyID 
organisationID 
CompanyName 

我想表明的是所有的頂級10最新的登錄者與loginTime。當用戶在我是一個參與者或者我是一個公司,組織

的成員在組織內的公司企業爲了讓我的組織:

SELECT organisationID 
FROM companys 
WHERE companyID IN (
    SELECT companyID 
    FROM companyParticipant 
    WHERE userID = @userID) 
GROUP BY organisationID 

所以我想IA查詢像這樣:

SELECT TOP 10 userName, LoginTime 
FROM .... 
ORDER BY loginID 
+1

+0.5爲「深」加盟 – Kermit

回答

0
SELECT userName, loginTime 
     FROM 
(
    SELECT u.userName, l.loginTime, 
      rn = row_number() over (partition BY u.userName 
           ORDER BY l.loginTime DESC) 
     FROM companyParticipant cp 
     JOIN companys c ON c.companyID = cp.companyID 
     JOIN companys c2 ON c2.organisationID = c.organisationID -- same organisation 
     JOIN companyParticipant cp2 ON cp2.companyID = c2.companyID -- participants of same org 
     JOIN login l ON l.userID = cp2.userID 
     JOIN [user] u ON u.userID = l.userID 
    WHERE cp.userID = @userID 
)   X 
    WHERE rn = 1 
    ORDER BY loginTime DESC 
+0

我忘了告訴大家,它必須是唯一的用戶在排名前10位的結果 – Addeladde

+0

使用'ROW_NUMBER' – RichardTheKiwi

+0

打破平局更新真的appriate我得到的幫助。我不能讓這個查詢運行速度快,需要2-3秒才能運行。 – Addeladde

0

此查詢會在第二和超快的是。似乎奇怪的 不需要tiebreaking或者beacuase總是有人登錄,並且新的登錄必須相隔10分鐘,否則它只會更新最後一次登錄。

SELECT  TOP (10) l.loginID, l.loginTime,u.userName 
FROM   logins AS l WITH(NOLOCK) INNER JOIN 
         users AS u WITH(NOLOCK) ON l.UserID = u.UserID 
WHERE  (l.UserID <> @userID) 
AND u.userID IN(SELECT u.userID FROM companyParticipants AS sp2 WHERE sp2.companyID IN (SELECT sc2.companyID FROM company AS sc2 WHERE sc2.organisationID IN(
SELECT sc.organisationID FROM company AS sc LEFT JOIN companyParticipants AS sp ON sc.companyID = sp.companyID WHERE sp.userID = @userID AND sc.organisationID > 0 GROUP BY sc.organisationID 
))) 
ORDER BY l.loginID DESC