當前位置:首頁 » 編程語言 » sql先倒序再分頁
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql先倒序再分頁

發布時間: 2022-09-04 03:54:49

A. sql 分頁排序問題

你把所有的id都換成px可以嗎?然後你要給px欄位建一個索引

B. sql中的排序,如何使用倒序

sql中排序倒序使用desc關鍵字,一般需要和order by 合用,示例sql語句如下:

例如:select * from student order by age desc;

意思是查詢學生表,以學生年紀倒序排列。

排序採用 order by 子句,order by 後面跟上排序欄位,排序欄位可以放多個,多個採用逗號間隔,order by默認採用升序(asc),如果存在 where 子句,那麼 order by 必須放到where 語句後面。

例如:select ename,job,ename from emp order by job desc,sal desc;

意思是查詢員工表按照 job 和薪水倒序排序 。


(2)sql先倒序再分頁擴展閱讀

sql中升序(正序)用法介紹:

1、使用asc關鍵字

例如:select ename,sal from emp order by sal asc;

手動指定按照薪水由小到大排序(升序關鍵字 asc)

2、不加asc關鍵字,系統默認升序

例如:select ename,job,sal from emp where job = 」MANAGER」order by sal;

取得job 為 MANAGER 的員工,按照薪水由小到大排序(系統默
認由小到大)

C. Sql語句如何先排序,再使用top not in實現以排好的序列的ID分頁

selecttop10*fromtable1whereIDnotIN(

)

D. sql 排序後 分頁

SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber 里的ORDER BY ID 改成ORDER BY num 不行嗎??

E. sql server 2005 語句實現:分頁查詢,倒序的查詢,比如有50條記錄,第一次查詢得到46~50條5條記錄,

如果可以請更詳細描述你的問題:

方案1:最簡單的辦法

如果只是簡單的倒序。 那麼我們可以把order by 改成相反的就行。如原來是

order by attribut1,attribut2 ASC

改成:

order by attribut1,attribut2 DEC

然後再加上limit 0,5 就行了 第二頁則是limit 6,5... 第N頁是limit 1+(n-1)*5,5

F. sql分頁查詢語句 不加desc可以按升序排序並分頁 我需要按照時間倒序 加上desc 怎麼數據都不變 我是sql2008

時間欄位名是什麼?看你的SQL語句里好像沒有定義時間的排序。
假設時間欄位是addtime,那可以這么寫:
SELECT TOP 5 *
FROM WorkDaily where (guid not in
( SELECT TOP 15 guid FROM WorkDaily order by guid asc))
AND isdelete =0 AND CreateById=85 order by guid desc,addtime desc

G. 這個sql語句怎麼先排序後分頁

@SelectList VARCHAR(2000), --欲選擇欄位列表
@TableSource VARCHAR(100), --表名或視圖表
@SearchCondition VARCHAR(2000), --查詢條件
@OrderExpression VARCHAR(1000), --排序表達式
@PageIndex INT = 1, --頁號,從0開始
@PageSize INT = 10 --頁尺寸
AS
BEGIN
IF @SelectList IS NULL OR LTRIM(RTRIM(@SelectList)) = ''
BEGIN
SET @SelectList = '*'
END
PRINT @SelectList

SET @SearchCondition = ISNULL(@SearchCondition,'')
SET @SearchCondition = LTRIM(RTRIM(@SearchCondition))
IF @SearchCondition <> ''
BEGIN
IF UPPER(SUBSTRING(@SearchCondition,1,5)) <> 'WHERE'
BEGIN
SET @SearchCondition = 'WHERE ' + @SearchCondition
END
END
PRINT @SearchCondition

SET @OrderExpression = ISNULL(@OrderExpression,'')
SET @OrderExpression = LTRIM(RTRIM(@OrderExpression))
IF @OrderExpression <> ''
BEGIN
IF UPPER(SUBSTRING(@OrderExpression,1,5)) <> 'WHERE'
BEGIN
SET @OrderExpression = 'ORDER BY ' + @OrderExpression
END
END
PRINT @OrderExpression

IF @PageIndex IS NULL OR @PageIndex < 1
BEGIN
SET @PageIndex = 1
END
PRINT @PageIndex
IF @PageSize IS NULL OR @PageSize < 1
BEGIN
SET @PageSize = 10
END
PRINT @PageSize

DECLARE @SqlQuery VARCHAR(4000)

SET @SqlQuery='SELECT '+@SelectList+',RowNumber
FROM
(SELECT ' + @SelectList + ',ROW_NUMBER() OVER( '+ @OrderExpression +') AS RowNumber
FROM '+@TableSource+' '+ @SearchCondition +') AS RowNumberTableSource
WHERE RowNumber BETWEEN ' + CAST(((@PageIndex - 1)* @PageSize+1) AS VARCHAR)
+ ' AND ' +
CAST((@PageIndex * @PageSize) AS VARCHAR)
ORDER BY ' + @OrderExpression
PRINT @SqlQuery
SET NOCOUNT ON
EXECUTE(@SqlQuery)
SET NOCOUNT OFF

你參考下

H. 求救各位DBA大佬,SQL如何進行多對多表的統計排序分頁查詢

按照你的要求只需要兩張表,最後的那張course是不需要的。因為並不需要知道學生所選的課程是什麼,只要數量就可以了。
也就是只需要student和relationship兩張表關聯,然後再分組統計(也可以先在relat表中分組統計,然後再關聯。),最後在排一下序就可以了。
至於分頁這塊,不知道你是什麼資料庫,各個資料庫的分頁方式並不相同,你稍微查查,網上不要太多。

I. 請問SQL SERVER 怎樣先從小到大排序然後再分頁

select top 600 from table where id > (
select max(id) from (
select top (600*pageNum) id from table order by id
) innerTable
) outterTable

600*pageNum這個值需要你在程序里算好。就是頁碼*每頁的600條

J. 可以任意欄位排序 但是要分頁的一個sql存儲過程怎麼寫呀 是寫在一個存儲過程里

最近做一個項目,其中有許多部分需要用到分頁功能
並且這些需要分頁的地方有一個共同的特點,那就是,分頁,但並不是按ID(主鍵)來排序,而是要求按其他有重復值的列進行排序,比如,其中有一個頁面,要列出將近1萬條客戶記錄,要求按客戶付費金額進行排序,這種情況,如果使用網上流行的通用分頁存儲過程是行不能的,比如,像下面的分頁存儲過程雖然很棒,可是,用在這里的話,就無計可施:(這個存儲過程是我在CSDN上看到一位前輩高人寫的)

CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 欄位名
@PageSize int = 10, -- 頁尺寸
@PageIndex int = 1, -- 頁碼
@IsCount bit = 0, -- 返回記錄總數, 非 0 值則返回
@OrderType bit = 0, -- 設置排序類型, 非 0 值則降序
@strWhere varchar(4000) = '' -- 查詢條件 (注意: 不要加 where)
AS

declare @strSQL varchar(6000) -- 主語句
declare @strTmp varchar(6000) -- 臨時變數
declare @strOrder varchar(6000) -- 排序類型

if @OrderType != 0
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @fldName +"] desc"
end
else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @fldName +"] asc"
end

set @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
+ @strOrder

if @strWhere != ''
set @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @fldName + "] from [" + @tblName + "] where (" + @strWhere + ") "
+ @strOrder + ") as tblTmp) and (" + @strWhere + ") " + @strOrder

if @PageIndex = 1
begin
set @strTmp = ""
if @strWhere != ''
set @strTmp = " where (" + @strWhere + ")"

set @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "]" + @strTmp + " " + @strOrder
end

if @IsCount != 0
set @strSQL = "select count(*) as Total from [" + @tblName + "]"

exec (@strSQL)
GO 這個分頁存儲過程我一直用於某些場所,如果大家用過,相信應該比較認可它的性能,可是,從代碼中,我們看到,它有一個基本的要求,即是表或視圖必定有一個主鍵,隱含的要求是排序欄位必須是一個具備唯一值的欄位,這在我上面提到的應用是不可能滿足的,所以,這個存儲過程雖然有用,可是,在這個場合,卻用不上
後來看到CNBLOGS上另一位仁兄談到的關於ASP.NET FORUM使用的臨時表分頁法,就寫了一個臨時表的分頁存儲過程,也是通用的,實現起來比較上的方法還要容易,如下
CREATE PROCEDURE dbo.GetPageRecord
(
@tblName varchar(255), -- 表名
@fldlist varchar(1000)='*',
@fldName varchar(255), --排序欄位
@KeyField varchar(255), --主鍵
@PageSize int = 10, -- 頁尺寸
@PageIndex int = 1, -- 頁碼
@IsCount bit = 0, -- 返回記錄總數, 非 0 值則返回
@OrderType bit = 1, -- 設置排序類型, 非 0 值則降序
@strWhere varchar(4000) = '' -- 查詢條件 (注意: 不要加 where)
)
AS
SET NOCOUNT ON
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int

-- Set the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

-- Create a temp table to store the select results
create table #temp
(
RecNo int IDENTITY (1, 1) NOT NULL,
oldid int
)
--generate record
Declare @Sqlstr varchar(6000)
set @sqlstr='select '+@Keyfield+' from '+@tblname
if(@strWhere<>'')
begin
set @Sqlstr=@sqlstr+' where ('+@strWhere+')'
end
set @sqlstr=@sqlstr+' order by '+@fldName
if(@ordertype=0)
begin
set @sqlstr=@sqlstr+' asc'
end
else
begin
set @sqlstr=@sqlstr+' desc'
end
set @sqlstr='insert into #temp (oldid) '+@sqlstr
execute(@sqlstr)
set @sqlstr='SELECT '+@fldList+' FROM '+@tblname+' TableA (nolock), #temp T WHERE T.oldid = TableA.'+@keyfield+' AND T.RecNo > '+ cast(@PageLowerBound as varchar)+' AND T.RecNo < '+cast(@PageUpperBound as varchar)+' ORDER BY T.RecNo'
execute(@sqlstr)
GO 使用了這個臨時表方案的存儲過程後,為了提高性能,我大約在上面耗費了將近四天,反復測試性能,後來發現,無論怎樣的辦法,由於臨時表的性能的限制,就算將SELECT語句優化再優化,可是,還是由於臨時表的建立與丟棄在讀寫磁碟上耗費太多時間而導致該存儲過程穩定性極差.為什麼呢.我做了個測試,一個人訪問用此方法分頁的WEB頁面尚可,速度也理想(2000條記錄),但是,當5人以上訪問此頁面時,IIS會因過重負荷而導致ASP工作進程與W3P進程通信失敗,並且,SQL SERVER也會不定時出現緩沖區錯誤.為什麼呢?我想,正是由於使用了臨時表吧,後來,看到有人提議使用表變數,可是,想想,還是行不通,因為我的查詢條件是動態傳入的參數呀
由於性能差,導致我的WEB應用在處理分頁時頻頻當機,於是下定決心重寫新的存儲過程
昨晚在家從七點到十二點一直在寫,其實寫分頁存儲過程的原理應該相當簡單,下面的圖反映出以下,我兩種存儲過程實現的不同思想

原理是很簡單,大家都能想得到,問題是,過渡性結果集如何產生的問題,如果不是因為表名,條件,頁碼是參數化的化,我們大可以用一句SELECT TOP來完成它,可是,問題是,不能,因為它們是參數化的,下面的關鍵性內容將解除你這方面的顧慮,讓我們一起來研究一下MS SQL SERVER中隱藏的秘密吧:
第一個秘密是關於SELECT語句的:
SQL中的SELECT語句可以將另外一個SELECT語句作為內容來源,並且按此規律進行嵌套處理,但是,有一個前提,必須對作為來源的SELEC結果集指定別名,下面是一個示例性SQL語句,你可以在查詢分析器里證實它:
select top 10 * from (select top 100 * from tblprocts where name like '%mp3%' order by id desc) as a order by id desc 請相信你的眼睛,上面的語句確實能執行,可能你曾經試過執行類似的語句但並未成功,那是因為你沒有將來源結果集指定別名
第二個秘密是一個規則:
如果你想用select top 20*4的方式在SQL中取前80條記錄,你會失敗,因為TOP子句有一個限制,就是TOP num中的num不能是一個計算值或表達式而必須是一個既定的常量
第三個秘密足夠重大,我想,應該很少有人發現它,否則的話,很多問題便會變得簡單起來,簡要的說,它就是:SQL允許你用EXECUTE執行一個變數中定義的SQL語句,並且允許你在被執行的SQL語句中,再次嵌套入一個變數定義的語句,並且再次在其中用EXECUTE執行它,如果語言不足以證明,那麼下面的代碼將證明這是行得通並且是很好的
declare @sqlstr varchar(3000)
set @sqlstr='declare @subsqlstr varchar(1000);'
set @sqlstr=@sqlstr+'set @subsqlstr=''select * from tblprocts'';'
set @sqlstr=@sqlstr+'execute (@subsqlstr)'
execute(@sqlstr)
在上面的代碼中,@SQL變數中定義的是一組SQL語句,在這組SQL語句中,又定義了一個@SUBSQL變數,在其中存放了SELECT語句,
所以,當系統執行@SQLSTR時,其中定義的變數會被執行,執行的結果是,構造了一組動態執行的SQL語句,將其存入了變數,最後,在EXECUTE中又被執行,這種嵌套的執行,我們就姑且稱其為動態執行能力吧
不過,需要相當注意的是:
1,由於在變數中存放語句組,因此,且莫忘記在每一個語句末尾加上分號(分號是SQL一句語句的結束標志)
2,如果在語句中包含變數的賦值,請記住你是在寫一個變數賦值語句,因此記住加上單引號將值括起
3,如果你在變數中定義的語句組中要引用字元串常量,請先將單引號替換成兩個單引號

最後,我用上面的方法寫了兩種SQL通用分頁存儲過程:
它們具有以下特點1,支持欄位集合選擇,2支持任意欄位排序,

上面的圖,我們以最終結果集倒序為例,第一種方案,我們先取集集合OB,這可以用一個使用SELECT TOP 並使用升級排列的語句完成
然後對OB結果集進行倒序排序,再用"SELECT TOP 每頁記錄數"倒序 的方式取得目標集合AB,下面是存儲過程
create PROCEDURE dbo.GetPagingData
(
@tablename varchar(100),--表名或視圖表
@fieldlist varchar(4000)='*',--欲選擇欄位列表
@orderfield varchar(100),--排序欄位
@keyfield varchar(100),--主鍵
@pageindex int,--頁號,從0開始
@pagesize int=20,--頁尺寸
@strwhere varchar(4000),--條件
@ordertype bit=1--排序,1,降序,0,升序
)
AS

SET NOCOUNT ON
declare @sqlstr varchar(6000)
--處理SQL中危險字元,並且將條件處理成易嵌入的形式
set @sqlstr='declare @Rcount int;'
set @sqlstr=@sqlstr+'set @rcount=(select count('+@keyfield+') from '+@tablename+' where '+@strWhere+');'
set @strwhere=replace(@strwhere,'''','''''')
set @strwhere=replace(@strwhere,'--','')
set @strwhere=replace(@strwhere,';','')
set @sqlstr=@sqlstr+'declare @Rnum int;'
set @sqlstr=@sqlstr+'set @rnum=@rcount-'+cast(@pagesize as varchar)+'*'+cast(@pageindex as varchar)+';'
set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);'
if @ordertype=1
begin
set @sqlstr=@sqlstr+'set @sqlstr=''select top '+cast(@Pagesize as varchar)+' '+@fieldlist+' from (select top 100

percent * from (select top ''+cast(@rnum as varchar)+'' * from '+@tablename+' where '+@strwhere+'

order by '+@orderfield+' asc) as b order by paymoney desc) as a order by '+@orderfield+' desc '';'
end
else
begin
set @sqlstr=@sqlstr+'set @sqlstr=''select top '+cast(@Pagesize as varchar)+' '+@fieldlist+' from (select top 100

percent * from (select top ''+cast(@rnum as varchar)+'' * from '+@tablename+' where '+@strwhere+'

order by '+@orderfield+' desc) as b order by paymoney asc) as a order by '+@orderfield+' asc '';'
end
set @sqlstr=@sqlstr+'if @Rcount>0 begin execute(@sqlstr) end'
--print @sqlstr
execute(@sqlstr)
在上面的代碼中,還處理了沒有符合條件結果的情況
第二種方案的思想是這樣的,先用倒序的SELECT TOP (頁序號+1)*頁尺寸的方法取得AE結果集,再從AE結果集中用NOT IN 的方法排除掉用SELECT TOP 頁序號*頁尺寸的方法取得的結果集,最後,對目標結果集執行倒序,下面是實現的代碼
create PROCEDURE dbo.GetPagingRecord
(
@tablename varchar(100),--表名或視圖表
@fieldlist varchar(4000)='*',--欲選擇欄位列表
@orderfield varchar(100),--排序欄位
@keyfield varchar(100),--主鍵
@pageindex int,--頁號,從0開始
@pagesize int=20,--頁尺寸
@strwhere varchar(4000),--條件
@ordertype bit=1--排序,1,降序,0,升序
)
AS

SET NOCOUNT ON
declare @sqlstr varchar(6000)
--處理SQL中危險字元,並且將條件處理成易嵌入的形式
set @strwhere=replace(@strwhere,'''','''''')
set @strwhere=replace(@strwhere,'--','')
set @strwhere=replace(@strwhere,';','')
set @sqlstr='declare @CurPageNum int;'
set @sqlstr=@sqlstr+'declare @nextpagenum int;'
set @sqlstr=@sqlstr+'set @curpagenum='+cast(@PageIndex as varchar)+'*'+cast(@Pagesize as varchar)+';'
set @sqlstr=@sqlstr+'set @nextpagenum='+cast(@PageIndex+1 as varchar)+'*'+cast(@Pagesize as varchar)+';'
set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);'
if @ordertype=1
begin
set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from

'+@tablename+' where '+@strwhere+' order by '+@orderfield+' desc ) as a where '+@keyfield+' not in (

select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where '+@strwhere+'

order by '+@orderfield+' desc) order by '+@orderfield+' desc'';'
end
else
begin
set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from

'+@tablename+' where '+@strwhere+' order by '+@orderfield+' asc ) as a where '+@keyfield+' not in (

select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where '+@strwhere+'

order by '+@orderfield+' asc) order by '+@orderfield+' asc'';'
end
set @sqlstr=@sqlstr+'execute( @sqlstr)'
--print @sqlstr
execute(@sqlstr)
需要注意的是,如果要避免SQL注入式攻擊,請注意處理像分號,雙減號,單引號這些在SQL中有特殊含義的字元

至於上面兩個存儲過程哪個性能更好,那就取決於是對一個倒序的結果集再進入一次反序排列好呢,還是用NOT IN從一個大的結果集移除一個小的結果集好