2010-08-31 101 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]