2012-07-20 48 views
1

我想優化這個查詢sql使用計數&group by而不使用不同的關鍵字?

**SELECT * FROM Users WHERE Active = 1 AND UserId IN (SELECT UserId FROM Users_Roles WHERE RoleId IN (SELECT RoleId FROM Roles WHERE PermissionLevel >= 100)) ORDER BY LastName** 

執行時間越來越少聞一替換上面的查詢與下面連接,

 **SELECT u.* FROM Users u INNER JOIN Users_Roles ur ON (u.UserId = ur.UserId) INNER JOIN Roles r ON (r.RoleId = ur.RoleId) WHERE u.Active = 1 AND r.PermissionLevel > 100 GROUP BY u.UserId ORDER BY u.LastName** 

但上面的查詢提供了重複的記錄,因爲我的角色表已超過每個用戶一個入口。

我不能使用DISTINCT因爲是我找到替代SELECT(*)可供選擇COUNT(*)FROM找到計數分頁,然後執行數查詢和結果查詢

計數功能

正如我們已經知道,數& GROUP BY一起使用時會導致不好的輸出。

現在我想優化查詢,必須找到的行數的查詢,即計數。請給出更好的方法找出結果。

+0

我不明白是什麼問題。爲什麼'select count()'或者'select count(distinct u.UserId)'滿足你的需求? – paul 2012-07-20 09:44:27

+0

在我的函數中,我將select *從table_name中替換爲從table_name中選擇count(*)作爲count_var。所以在以往任何時候選擇使用不同的*它被替換爲SELECT COUNT(*),所以計數包括重複記錄 – suganya 2012-07-20 10:03:01

+0

然後嘗試'計數(不同的用戶id)' – paul 2012-07-20 10:03:59

回答

2

這是難以優化其他人查詢,而不充分了解架構,什麼是索引什麼不是,有多少數據是,你的DBMS是什麼等,即使這樣,我們不能看到執行計劃,IO統計數據等。考慮到這一點,下面的內容可能不會比你已有的內容更好,但它是我如何在你的情況下編寫查詢的。

SELECT u.* 
FROM Users u 
     INNER JOIN 
     ( SELECT ur.UserID 
      FROM Users_Roles ur 
        INNER JOIN Roles r 
         ON r.RoleID = ur.RoleID 
      WHERE r.PermissionLevel > 100 
      GROUP BY ur.UserID 
     ) ur 
      ON u.UserId = ur.UserId 
WHERE u.Active = 1 
ORDER BY u.LastName 
+0

問題它的工作原理,但笏問題是選擇在子查詢不同也被替換到SELECT COUNT(*),這將導致錯誤。 – suganya 2012-07-20 10:03:50

+0

我只是做了細微的變化。將這項工作? – GarethD 2012-07-20 10:19:41

+0

它的工作原理很好,謝謝 :) – suganya 2012-07-20 10:51:14