我已经看过几次这个问题了,我已经写了自己的查询,但是速度很慢,如果有人可以就如何加快速度提出建议,我将非常感激.
在简化的场景中,我有以下两个表:
组
- GroupID(主键)
成员
- MemberID(主键)
- GroupID(外键)
假设,对于Group中的每个GroupID,我想从Member中找到具有该GroupID的前2个MemberID值.
这是我当前的查询有效,但速度很慢:
SELECT M.MemberID, M.GroupID
FROM Member AS M
WHERE M.MemberID in
(Select top 2 Member.MemberID
FROM Member
Where Member.GroupID = M.GroupID
ORDER BY Member.MemberID)
Run Code Online (Sandbox Code Playgroud)
Say Group具有以下行
GroupID
1
2
3
和会员具有以下行
MEMBERID,的GroupID
1,1
2,2
3,3
4,1
5,2
6,3
7,1
8,2
9,3
然后我的查询应该返回:
MEMBERID的GroupID
1,1
2,2
3,3
4,1
5,2
6,3
我相信依赖的嵌套查询可能对数据库引擎很难很好地进行优化(尽管@John Saunders要求看到执行计划是有根据的,并且看到你所拥有的索引也不会受到伤害;-).
但是,一个更自然的方法来在SQL Server 2005和2008这样的排名有关的问题(和其他SQL引擎,因为该功能是在最近的ANSI标准)的排名函数- RANK,DENSE_RANK或者ROW_NUMBER......他们全是等价的,当你无论如何,按一个独特的领域排名;-).即使除了优化之外,一旦你习惯了它们就会更容易阅读(当你的问题比这个问题更难时更强大),特别是在其他整洁的新建筑的帮助下,WITH条款...... :
WITH OrderedMembers AS
(
SELECT MemberId, GroupId,
ROW_NUMBER() OVER (PARTITION BY GroupId ORDER BY MemberId) AS RowNumber
FROM Member
)
SELECT MemberId, GroupId
FROM OrderedMembers
WHERE RowNumber <= 2
ORDER BY MemberId;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1083 次 |
| 最近记录: |