2010-08-31 97 views
1

我想在此查询中使用Row_Number()方法实现分页,但没有运气。在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], 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表,所以我可以使用

Where RowNumber BETWEEN @rowStart AND @rowEnd 

得到的每个请求记录X号,但我不断收到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 = @cultureID UNION ALL SELECT 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凡SITEID在CATID( SELECT ID FROM层次吨)))

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

“但我不断收到T-SQL的错误” 请张贴?这通常是最可爱的部分。 :) – 2010-08-31 15:33:09

+0

当我箍起来ROW_NUMBER()OVER(按[DateAdded] DESC排序)作为'RowNumber'作为dbo.TH_Sites的附加列,并添加RowNumber在1和5之间到'where dbo.TH_Sites id in ...' 我得到的RowNumber不是一个有效的列。 – 2010-08-31 15:39:04

+0

你可以把这个SQL在你的问题? – 2010-08-31 15:46:57

回答

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服务器现在来测试这个) 。

+0

分页处于称为dbo.TH_Sites的嵌套表的级别。 – 2010-08-31 16:20:01

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使用子查询。

+0

另外,你可能会使用JOIN而不是WHERE ... IN。 – 2010-08-31 15:59:56

+0

当我连接另一个CTE查询时,出现以下错误: 关键字'with'附近的语法错误。如果此语句是公用表表达式,xmlnamespaces子句或变更跟踪上下文子句,则前面的语句必须以分号结尾。 – 2010-08-31 16:07:10

+0

@Joseph - 你用逗号分隔它们。例如'; tl as(select ...),t2 as(select ...)select * from t1 join t2 ...' – 2010-08-31 16:08:39

0

已编辑:在最终选择中增加了独特内容,以便将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; 
+0

它很接近,但我得到了rownumber = 5 6条记录。 所以它不准确。 – 2010-08-31 16:56:24

+0

RowNumber 1到5之间是16行。 – 2010-08-31 16:57:28

+0

如果类别提要在连接上提供多个记录,我在最终选择上添加了一个独特内容。不知道你的表情。 – user404463 2010-08-31 17:28:53

0

该查询返回所有的网站:

WITH hierarchy AS (

SELECT yt.id

FROM [dbo].[TH_Categories] yt 

WHERE yt.ID = @topicID而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 (

选择从dbo.TH_CategoryFeeds凡CATID在( SELECT ID FROM层次t))的

我只需要实现分页到该查询鲜明SITEID。这很难吗?

加入T-SQL GURUS !!!!!

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 
+0

我得到这4行: 窗口函数只能出现在SELECT或ORDER BY子句。 – 2010-08-31 19:36:32

+0

杰夫,这是一个艰难的椰子:) – 2010-08-31 19:36:52

+0

是的,这是我的想法。 :( – 2010-08-31 19:46:19

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>[email protected] and RowNumber<[email protected]