1

idとrevisionの複合主キーを含むテーブル構造があります。どちらも整数です。

各行の最新のリビジョンを返すクエリが必要です。この答えを正しく理解していれば、OracleDBでは次のことが機能します。

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

SQL Server(2005)を使用していますが、同じことを行うにはパフォーマンスの高いクエリが必要です。

4

5 に答える 5

2

最良の戦略の評価については、ayendeによるこの投稿を参照してください。

于 2009-09-16T09:39:54.097 に答える
2

私はこれがうまくいくと思います(私はそれをテストしませんでした)...

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
于 2009-09-16T09:44:22.557 に答える
1

次のようなサブクエリを作成しようとします。

SELECT Id, Title 
FROM Task T, (Select ID, Max(Revision) MaxRev  from Task group by ID) LatestT
WHERE T.Revision = LatestT.MaxRev and T.ID = LatestT.ID

もう1つのオプションは、「チート」して、1つのアイテムが追加された場合に、リビジョンに最新のリビジョンとしてフラグを立てるトリガーを作成することです。次に、そのフィールドをインデックスに追加します。(テーブルをリンクして挿入のみします)

また、IDのインデックスであるRevisiondescがパフォーマンスに役立つ可能性があります。

于 2009-09-16T09:43:32.330 に答える
0

投稿したクエリは、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
于 2009-09-16T09:48:54.890 に答える
0

これを試して:

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)
于 2009-09-16T11:53:37.117 に答える