在条件之间按指定顺序执行SQL顺序
这是选择8条记录的分页查询的一部分:在条件之间按指定顺序执行SQL顺序,sql,tsql,Sql,Tsql,这是选择8条记录的分页查询的一部分: SELECT * FROM #Results WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 ORDER BY ad_type ASC,NEWID() 但首先选择8条记录,然后按它们排序 我想先按所有记录排序,然后在下一页获取中选择8条下一个记录,而不复制任何记
SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
ORDER BY ad_type ASC,NEWID()
但首先选择8条记录,然后按它们排序
我想先按所有记录排序,然后在下一页获取中选择8条下一个记录,而不复制任何记录
这是我的第一页结果:
这是第二页的结果:
在第二页中有一条ad_类型为2的记录,该记录应位于第一页,而不是第一页结果中的最后一条记录
这就是我的全部程序:
GO
ALTER PROCEDURE [dbo].[GetAdPageWise]
@PageIndex INT = 1
,@PageSize INT = 3
,@PageCount INT OUTPUT
,@state_id int=NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT Id,ROW_NUMBER() OVER
(
ORDER BY Id
)AS RowNumber
,ad_title
,ad_brief
,ad_pic
,ad_type
INTO #Results
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY a.ID) AS rn, a.Id
,a.ad_title
,a.ad_brief
,a.ad_pic
,a.ad_type
FROM [tbl_ads] a LEFT JOIN tbl_inf_adstate b ON a.Id=b.ad_id
WHERE (b.state_id=@state_id OR @state_id IS NULL)
AND a.ad_is_accept=1
AND a.ad_is_show=1
AND a.ad_is_slide=0
)x
WHERE rn = 1
DECLARE @RecordCount INT
SELECT @RecordCount = COUNT(*) FROM #Results
SET @PageCount = CEILING(CAST(@RecordCount AS DECIMAL(10, 2)) / CAST(@PageSize AS DECIMAL(10, 2)))
PRINT @PageCount
SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 ORDER BY ad_type ASC,NEWID()
DROP TABLE #Results
END
我该怎么做呢?听起来你想同时显示某一特定广告类型的所有广告,所以你应该先按此顺序订购。我假设这是基于显示的结果,没有重复,但第一批是1,45之间的ad_id,第二批是46,58 要做到这一点,只需更改以下行,不需要分区依据,因为我们只想创建一个从1到n的长长的行号列表:
SELECT ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY a.ID) AS rn, a.Id
致:
但我确实看到了查询中需要指出的一些其他问题:
使用上面介绍的解决方案,它假定数据不会在您下方发生变化。假设只添加了行,并且ad_id总是在增加,这在以前不是什么问题,但是现在我们先按ad_类型排序,然后按ad_id排序,这可能会更大,如果需要,应该加以考虑。
为了确保联接的逻辑中没有错误,您应该在tbl_inf_adstate.ad_id上放置一个唯一的约束,否则您需要更改联接,因为它会在结果中复制来自tbl_ads的行。
如果您使用的是SQL Server 2012或更高版本,则可能需要
你太晚了。行号必须已经被订购,否则它是非常无用的:您需要将您想要的订购添加到行号中,而不是order by。。。用于创建结果的子句。假设您首先确实需要结果:我需要样本数据、所需结果和整个查询来帮助您。@Stephan我编辑了我的问题。您的排序条件是不确定的-即使没有筛选,您也不能保证两次运行的查询会对行进行相同的排序。在对其余部分进行排序之前,您首先需要选择一些确定的排序标准-去掉newid。您必须在数据中标识足够多的列,以便每一行在这些列中始终具有唯一的值,而不是当前多行具有相同ad_类型值的情况。然后,您需要在排序/分页逻辑中包含所有这些列。
SELECT ROW_NUMBER() OVER (ORDER BY a.ad_type, a.ID) AS rn, a.Id
SELECT a.Id
,a.ad_title
,a.ad_brief
,a.ad_pic
,a.ad_type
FROM [tbl_ads] a
LEFT JOIN tbl_inf_adstate b
ON a.Id = b.ad_id
AND a.ad_is_accept=1
AND a.ad_is_show=1
AND a.ad_is_slide=0
WHERE b.state_id = @state_id
OR @state_id IS NULL
order by a.ad_type, a.Id
OFFSET (@PageIndex -1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;