簡體   English   中英

order by和sub-query

[英]order by and sub-query

我有一個基本的存儲過程的麻煩,不幸的是我不是一個SQL專家,我想要做的是按2參數排序提供結果, @OrderBy@SortOrder ,但結果只@SortOrder結果排序-query。 例如:

exec [dbo].[GetTest2] @Page=0,@Limit=150,@OrderBy=N'NetworkName',@SortOrder=N'asc'

它按預期工作,但是

exec [dbo].[GetTest2] @Page=0,@Limit=15,@OrderBy=N'NetworkName',@SortOrder=N'asc'

不起作用,因為子查詢不返回所有記錄。

我怎樣才能整理整個記錄集?

USE [MyContext]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter PROCEDURE [dbo].[GetTest2] 
    @Page int = 0,
    @Limit int = 10,
    @OrderBy nvarchar(50) = 'OfferId',
    @Name nvarchar(100) = NULL,
    @SortOrder nvarchar(50) = 'asc'
AS
BEGIN
    SET NOCOUNT ON;
    SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY @OrderBy) AS ROWNUMBER, 
                  COUNT(*) OVER() AS [Total_Rows], 
                  a.Name AS NetworkName, 
                  o.*  

                  FROM offers AS o 
                    left outer join AffiliateNetworks AS a ON o.NetworkId = a.Id

                  WHERE (@Name IS NULL OR o.Name LIKE '%' + @Name + '%' )) AS Paged 
    WHERE 

    Paged.ROWNUMBER > @Limit * @Page AND 
    Paged.ROWNUMBER <= (@Limit * @Page) + @Limit

    order by 
                    case 
                        when @SortOrder <> 'asc' then NULL
                        when @OrderBy = 'Name' then Name
                        end ASC,
                    case 
                        when @SortOrder <> 'asc' then NULL
                        when @OrderBy = 'NetworkName' then NetworkName
                        end ASC,
                    case 
                        when @SortOrder <> 'desc' then NULL
                        when @OrderBy = 'Name' then Name
                        end DESC,
                    case 
                        when @SortOrder <> 'desc' then NULL
                        when @OrderBy = 'NetworkName' then NetworkName
                        end DESC

END 

您可以考慮在ROW_NUMBER中添加排序以保持分頁一致。 我將子查詢包裝在CTE中,使其更容易閱讀。

ALTER PROCEDURE [dbo].[GetTest2] 
    @Page int = 0,
    @Limit int = 10,
    @OrderBy nvarchar(50) = 'OfferId',
    @Name nvarchar(100) = NULL,
    @SortOrder nvarchar(50) = 'asc'
AS
BEGIN
    SET NOCOUNT ON;

    ;WITH Paged AS (
        SELECT ROW_NUMBER() OVER (
            ORDER BY
                CASE WHEN @SortOrder = 'ASC'
                    THEN (CASE @OrderBy WHEN = 'Name' THEN Name WHEN 'NetworkName' THEN a.Name END) END ASC,
                CASE WHEN @SortOrder = 'DESC'
                    THEN (CASE @OrderBy WHEN = 'Name' THEN Name WHEN 'NetworkName' THEN a.Name END) END DESC)
            ) AS ROWNUMBER,
            COUNT(*) OVER() AS [Total_Rows],
            a.Name AS NetworkName,
            o.*
        FROM offers AS o 
            left outer join AffiliateNetworks AS a ON o.NetworkId = a.Id
        WHERE (@Name IS NULL OR o.Name LIKE '%' + @Name + '%' )
    )
        SELECT *
        FROM Paged
        WHERE ROWNUMBER - (@Limit * @Page) BETWEEN 1 AND @Limit
        ORDER BY ROWNUMBER
END
GO

正如評論中所提到的,在SQL Server的更高版本中, ROW_NUMBER可能不是最佳的分頁構造。 如果您使用至少2012或更高版本,則可以使用OFFSETFETCH NEXT進行分頁。 然后你的查詢變成這樣的:

    SELECT
        COUNT(*) OVER() AS [Total_Rows],
        CASE @OrderBy WHEN = 'Name' THEN o.Name WHEN 'NetworkName' THEN a.Name END AS SortName,
        a.Name AS NetworkName,
        o.*
    FROM offers AS o 
        left outer join AffiliateNetworks AS a ON o.NetworkId = a.Id
    WHERE (@Name IS NULL OR o.Name LIKE '%' + @Name + '%' )
    ORDER BY
        CASE WHEN @SortOrder = 'ASC' THEN SortName ELSE NULL END ASC,
        CASE WHEN @SortOrder = 'DESC' THEN SortName ELSE NULL END DESC
    OFFSET (@Page * @Limit) ROWS
    FETCH NEXT @Limit ROWS ONLY;

嘗試這個:

order by 
                    case 
                        when @OrderBy = 'Name' and @SortOrder = 'asc' then Name
                        when @OrderBy = 'NetworkName' and @SortOrder = 'asc' then NetworkName
                        end ASC,

                    case when @OrderBy = 'Name' and @SortOrder = 'desc' then Name
                         when @OrderBy = 'NetworkName' and @SortOrder = 'desc' then NetworkName
                         end DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM