sql使用count&分组不使用distinct关键字?

时间:2012-07-20 09:31:01

标签: sql count group-by distinct multiple-tables

我想优化此查询

    **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( * )FROM替换为SELECT COUNT(*)FROM来查找分页和然后执行计数查询和结果查询

正如我们已经知道的那样GROUP BY一起使用会导致输出错误。

现在我想优化查询并且必须找到行数,即查询的计数。请更好地找出结果。

1 个答案:

答案 0 :(得分: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