3

これが私のSQL Server 2008ストアドプロシージャです。

ALTER PROCEDURE [dbo].[GetSharedSmoothies]
    @Page INT ,
    @Status INT ,
    @ItemPerPage INT
AS 
    BEGIN
        SET NOCOUNT ON;

        DECLARE @X INT 
        DECLARE @Y INT

        SET @X = ( @Page - 1 ) * @ItemPerPage
        SET @Y = @Page * @ItemPerPage


        SELECT  *
        FROM    ( SELECT    S.* ,
                            U.Avatar ,
                            U.Displayname ,
                            ( SELECT    COUNT(Id)
                              FROM      Vote
                              WHERE     Vote.SmoothieId = S.Id
                            ) AS Votes ,
                            ROW_NUMBER() OVER ( ORDER BY S.Id ) rownum
                  FROM      dbo.Smoothie AS S
                            INNER JOIN dbo.[User] AS U ON S.UserId = U.Id
                  WHERE     S.IsPublic = 1
                            AND S.Status = 3
                            AND S.UserId > 0
                  -- ORDER BY  S.CreatedDate DESC
                ) seq
        WHERE   seq.rownum BETWEEN @X AND @Y
        ORDER BY seq.rownum
    END

私のコードでは、注文をコメントアウトしていることがわかります

 -- ORDER BY  S.CreatedDate DESC

order by はサブクエリでは機能しないためです。一番上に最新のものを表示する必要があります。コードで order by を使用する方法はありますか?

4

2 に答える 2

3

それは正しい。何もしないため、許可されません。

サブクエリの一番上に最新のものを置いても、サブクエリを使用した結果セットには何もしません。

必要な列を結果セットに追加しますORDER BY

ORDER BY seq.CreatedDate DESC, seq.rownum

または:

ORDER BY seq.rownum, seq.CreatedDate DESC
于 2012-12-31T17:05:43.920 に答える
3

S.CreatedDate内に追加できますRow_NUMBER()

ROW_NUMBER() OVER (PARTITION BY S.Id ORDER BY S.CreatedDate DESC) AS RowNum

于 2012-12-31T17:07:56.243 に答える