我的表结构包含 id 和 revision 的复合主键,其中两者都是整数。

我需要一个查询来返回每行的最新版本。如果我明白的话 这个答案 正确的话,以下内容将在 Oracle DB 上运行。

SELECT Id, Title
FROM ( SELECT Id, Revision, MAX(Revision) OVER (PARTITION BY Id) LatestRevision FROM Task )
WHERE Revision = LatestRevision

我正在使用 SQL Server (2005),并且需要一个高性能查询来执行相同的操作。

有帮助吗?

解决方案

请参阅由ayende发布,以便对最佳策略进行评估。

其他提示

我认为这应该有效(我没有测试过)......

SELECT      ID, 
            Title
FROM        Task AS T
INNER JOIN
(
    SELECT          ID, 
                    Max(Revision)
    FROM            Task
    GROUP BY        ID
) AS sub
ON          T.ID = sub.ID
AND         T.Revision = sub.Revision

我会尝试创建一个像这样的子查询:

从任务t中选择ID,标题(选择ID,MAX(修订)MAXREV,由ID组成的MAXREV)最新t.revision =最新t.maxrev和t.id =最新

另一种选择是“作弊”并创建一个触发器,如果​​添加了一个项目,该触发器会将修订标记为最新修订。然后将该字段添加到索引中。(我会将表链接到仅插入)

另外,ID 上的索引、Revision desc 也可以帮助提高性能

您发布的查询将在SQL 2005中工作(在兼容模式90下),并且纠正了语法错误:

SELECT t1.Id, t1.Title
FROM ( SELECT Id, Revision, MAX(Revision) OVER (PARTITION BY Id) LatestRevision FROM Task ) AS x
JOIN Task as t1
ON   t1.Revision = x.LatestRevision
AND  t1.id       = x.id

试试这个:

DECLARE @YourTable table(RowID int, Revision int, Title varchar(10))
INSERT INTO @YourTable VALUES (1,1,'A')
INSERT INTO @YourTable VALUES (2,1,'B')
INSERT INTO @YourTable VALUES (2,2,'BB')
INSERT INTO @YourTable VALUES (3,1,'C')
INSERT INTO @YourTable VALUES (4,1,'D')
INSERT INTO @YourTable VALUES (1,2,'AA')
INSERT INTO @YourTable VALUES (2,3,'BBB')
INSERT INTO @YourTable VALUES (5,1,'E')
INSERT INTO @YourTable VALUES (5,2,'EE')
INSERT INTO @YourTable VALUES (4,2,'DD')
INSERT INTO @YourTable VALUES (4,3,'DDD')
INSERT INTO @YourTable VALUES (6,1,'F')

;WITH YourTableRank AS
(
SELECT
    RowID,Revision,Title, ROW_NUMBER() OVER(PARTITION BY RowID ORDER BY RowID,Revision DESC) AS Rank
    FROM @YourTable
)
SELECT
    RowID, Revision, Title
    FROM YourTableRank
    WHERE Rank=1

输出:

RowID       Revision    Title
----------- ----------- ----------
1           2           AA
2           3           BBB
3           1           C
4           3           DDD
5           2           EE
6           1           F

(6 row(s) affected)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top