在T-SQL中分页

时间:2010-08-31 15:29:57

标签: sql sql-server sql-server-2005 tsql

我正在尝试使用此查询中的Row_Number()方法实现分页,但没有运气。

以下Query使用递归方式获取一组类别的网站。

    WITH hierarchy AS (
  SELECT yt.id

    FROM [dbo].[TH_Categories] yt
   WHERE yt.ID = @topicID And CultureID = @cultureID 
  UNION ALL
  SELECT yt.id

    FROM [dbo].[TH_Categories] yt
    JOIN hierarchy h ON h.ID = yt.ParentCategoryID)
    Select id, [SiteName]
      ,[SiteURL]
      ,[Description]
      ,[Logo]
      ,[CultureID]
      ,[DateAdded],  dbo.GetSiteFollowers(id) AS Followers from dbo.TH_Sites where id in (
 Select Distinct SiteID from dbo.TH_CategoryFeeds Where CatID in (
   SELECT ID
    FROM hierarchy t   ))

此查询返回一组类别的所有网站。我正在尝试将Row_Number()集成到dbo.TH_Sites表中,以便我可以使用

为每个请求获取x个记录
Where RowNumber BETWEEN @rowStart AND @rowEnd

但我不断收到T-SQL错误。

任何提示家伙,谢谢。

我正在尝试这个:

    WITH hierarchy AS (
  SELECT yt.id

    FROM [dbo].[TH_Categories] yt
   WHERE yt.ID = @topicID And CultureID = @cultureID 
  UNION ALL
  SELECT yt.id

    FROM [dbo].[TH_Categories] yt
    JOIN hierarchy h ON h.ID = yt.ParentCategoryID)

    Select id, [SiteName]
      ,[SiteURL]
      ,[Description]
      ,[Logo]
      ,[CultureID]
      ,[DateAdded], ROW_NUMBER() OVER (order by [DateAdded] DESC) AS 'RowNumber' ,  dbo.GetSiteFollowers(id) AS Followers from dbo.TH_Sites where RowNumber = 5  AND  id in (
 Select Distinct SiteID from dbo.TH_CategoryFeeds Where CatID in (
   SELECT ID
    FROM hierarchy t)) 

但我得到的RowNumber不是一个有效的列

这是另一个实施:

WITH hierarchy AS (

SELECT yt.id

FROM [dbo].[TH_Categories] yt

WHERE yt.ID = @topicID和CultureID = @cultID   UNION ALL   选择yt.id

FROM [dbo].[TH_Categories] yt
JOIN hierarchy h ON h.ID = yt.ParentCategoryID)
WITH numbered_hierarchy AS (
Select id, [SiteName]
  ,[SiteURL]
  ,[Description]
  ,[Logo]
  ,[CultureID]
  ,[DateAdded] , ROW_NUMBER() OVER (order by [DateAdded] DESC) AS 'RowNumber',  dbo.GetSiteFollowers(id) AS Followers from dbo.TH_Sites where  id in (

从dbo.TH_CategoryFeeds中选择Distinct SiteID,其中CatID在(    选择ID     来自等级t)))

 SELECT id
     , [SiteName]
     , [SiteURL]
     , [Description]
     , [Logo]
     , [CultureID]
     , [DateAdded]
     , RowNumber
     , Followers
FROM numbered_hierarchy
WHERE RowNumber BETWEEN 1 AND 5

6 个答案:

答案 0 :(得分:3)

您需要将ROW_NUMBER()功能放入CTE:

WITH YourCTE AS
(
   SELECT (list of fields),
          ROW_NUMBER() OVER(ORDER BY ......) AS 'RowNum'
) 
SELECT (list of fields), RowNum
FROM YourCTE

一旦这样做,您可以轻松地从CTE中选择某些行:

WITH YourCTE AS
(
   SELECT (list of fields),
          ROW_NUMBER() OVER(ORDER BY ......) AS 'RowNum'
) 
SELECT (list of fields), RowNum
FROM YourCTE
WHERE RowNum BETWEEN 51 AND 75  -- or something like that

虽然不确定递归CTE的效果如何(我现在手头没有SQL Server来测试)。

答案 1 :(得分:2)

SQL不允许在WHERE子句中使用列别名。相反,将RowNumber计算放入CTE:

WITH numbered_rows AS (
    SELECT s.id
         , s.[SiteName]
         , s.[SiteURL]
         , s.[Description]
         , s.[Logo]
         , s.[CultureID]
         , s.[DateAdded]
         , ROW_NUMBER() OVER (order by s.[DateAdded] DESC) AS [RowNumber]
         , dbo.GetSiteFollowers(s.id) AS [Followers]
    FROM dbo.TH_Sites s
    INNER JOIN (
        SELECT DISTINCT SiteID
        FROM dbo.TH_CategoryFeeds cf
        INNER JOIN dbo.TH_Categories c ON c.ID = cf.CatID
        WHERE (c.ID = @topicID OR c.ParentCategoryID = @topicID)
            AND c.CultureID = @cultureID
    ) feeds ON feeds.SiteID = s.ID
)

SELECT id
     , [SiteName]
     , [SiteURL]
     , [Description]
     , [Logo]
     , [CultureID]
     , [DateAdded]
     , RowNumber
     , Followers
FROM numbered_rows
WHERE RowNumber BETWEEN @rowStart AND @rowEnd

编辑:取消hierarchy CTE。

编辑:修改了JOIN以使用子查询。

答案 2 :(得分:0)

编辑:在最终选择中添加了distinct,cte的连接提供了多个记录。

试试这个,我认为这是你想要的。

;with hierarchy 
as
(
    select 
        yt.id

    from 
        dbo.TH_Categories yt

    where 
        yt.ID = @topicID 
        and CultureID = @cultureID 

    union

    select 
        parent.id as id

    from 
        dbo.TH_Categories yt
        left join dbo.th_categories parent
            on yt.id = parent.parentcategoryid
    order by dateadded desc
)

select distinct
    ths.id 
    ,ths.[SiteName]
    ,ths.[SiteURL]
    ,ths.[Description]
    ,ths.[Logo]
    ,ths.[CultureID]
    ,ths.[DateAdded],  
    dbo.GetSiteFollowers(ths.id) AS Followers 

from 
    dbo.TH_Sites ths
    join dbo.TH_CategoryFeeds cf
        on ths.id = cf.siteid
    join 
        (
            select
                id
                ,row_number() as RowNumber
            from
                hierarchy 
        ) h on cf.catid = h.id

where
    h.rownumber = 5;

答案 3 :(得分:0)

此查询返回所有网站:

WITH hierarchy AS (

SELECT yt.id

FROM [dbo].[TH_Categories] yt

WHERE yt.ID = @topicID和CultureID = @cultID   UNION ALL   选择yt.id

FROM [dbo].[TH_Categories] yt
JOIN hierarchy h ON h.ID = yt.ParentCategoryID)

Select id, [SiteName]
  ,[SiteURL]
  ,[Description]
  ,[Logo]
  ,[CultureID]
  ,[DateAdded], dbo.GetSiteFollowers(id) AS Followers from dbo.TH_Sites where  id in (

从dbo.TH_CategoryFeeds中选择Distinct SiteID,其中CatID在(    选择ID     来自等级t))

我只需要对此查询实现分页。那难吗?

来吧T-SQL GURUS !!!!!

答案 4 :(得分:0)

WITH hierarchy AS
(
    SELECT yt.id
    FROM [dbo].[TH_Categories] yt
    WHERE yt.ID = @topicID AND CultureID = @cultureID

    UNION ALL

    SELECT yt.id
    FROM [dbo].[TH_Categories] yt
    JOIN hierarchy h ON h.ID = yt.ParentCategoryID
)
SELECT id
    , [SiteName]
    , [SiteURL]
    , [Description]
    , [Logo]
    , [CultureID]
    , [DateAdded]
    , dbo.GetSiteFollowers(id) AS Followers
FROM dbo.TH_Sites
WHERE id in
(
    SELECT DISTINCT SiteID
    FROM dbo.TH_CategoryFeeds
    WHERE CatID IN ( SELECT ID FROM hierarchy t )
)
AND ROW_NUMBER() OVER (ORDER BY [DateAdded] DESC) BETWEEN @rowStart AND @rowEnd
ORDER BY [DateAdded] DESC

答案 5 :(得分:0)

;WITH hierarchy AS 
(
     SELECT yt.id    
       FROM [dbo].[TH_Categories] yt
      WHERE yt.ID = @topicID And CultureID = @cultureID
     UNION ALL
     SELECT yt.id    
       FROM [dbo].[TH_Categories] yt
       JOIN hierarchy h ON h.ID = yt.ParentCategoryID
)
, YourRows AS 
(
    Select id, 
           [SiteName]
          ,[SiteURL]
          ,[Description]
          ,[Logo]
          ,[CultureID]
          ,[DateAdded]
          ,dbo.GetSiteFollowers(id) AS Followers 
          ,ROW_NUMBER() OVER (ORDER BY [DateAdded] DESC) AS RowNumber
     from dbo.TH_Sites 
    where id in (Select Distinct SiteID 
                   from dbo.TH_CategoryFeeds 
                  Where CatID in (SELECT ID
                                    FROM hierarchy t ))
)
SELECT * FROM YourRows 
WHERE RowNumber>=@rowStart and RowNumber<=@rowEnd