我正在尝试使用此查询中的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
答案 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