SQL改ページに関するお問い合わせ
3539 ワード
一つ目は前のページgesize*pagecount条に記録されている逆順の中の前のページgesize条を取って記録し、また正順に来ます。
ページごとにデータがあることは保証できますが、最後のページと最後のページの二ページが重複している可能性があります。
select*from(
select TOP 6*FROM(
SELECT TOP 6*
from logo gudods
Where NuCLASSES ID=1
ORDER BY NUGOOD S ID ASC)
as aSysTable
ORDER BY NUGOOD S ID DESC)
as bSysTable
ORDER BY N_GOODS_ID ASC
はい、すごいのを見つけます。
この転載は李洪根さんのブログから来ました。作者はマイクロソフトのMVPです。以下の3つの案を参考にして、実際の状況に合わせて選んでください。
テーブルを作成:
CREATE TABLE[TestTable](
[ID][int]IDENTITY(1,1)NOT NULL、
[First Name][nvarrhal](100)COLLATE Chinese euPRC CI_ASNULL、
[LastName][nvarrhar](100)COLLATE Chinese euPRC CI_ASNULL、
[Country][nvarrhal](50)COLLATE Chinese euPRC CI AS NULL、
[Note][nvarrhal](2000)COLLATE Chinese euPRC CI NULL
)ON[PRIMARY]
GO
挿入データ:(2万本以上、より多くのデータでテストすると明らかになります。)
SET IDENTITY_INSERT TestTable ON
declare@i int
set@i=1
while@i<=20000
begin
insert into TestTable([id],First Name,LastName,Country,Note)values(@i,'First NameuXXX','LastNameuXXX','Country_XXX','Noteu XXX')
set@i=@i+1
end
SET IDENTITY_INSERT TestTable OFF
-----------------------
改ページ案一:(Not InとSELECT TOPの改ページを利用する)語句形式:
SELECT TOP 10*
FROM TestTable
WHERE(ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOPページサイズ*
FROM TestTable
WHERE(ID NOT IN
(SELECT TOPページサイズ*ページ数id
FROM表
ORDER BY id))
ORDER BY ID
-----------------------
改ページ案二:(利用IDがどれぐらい大きいかとSELECT TOP分ページ)
ステートメント形式:
SELECT TOP 10*
FROM TestTable
WHERE(ID>
(SELECT MAX(id)
FROM(SELECT TOP 20 id
FROM TestTable
ORDER BY id)AS)
ORDER BY ID
SELECT TOPページサイズ*
FROM TestTable
WHERE(ID>
(SELECT MAX(id)
FROM(SELECT TOPページサイズ*ページ数id
FROM表
ORDER BY id)AS)
ORDER BY ID
-----------------------
改ページ案3:(SQLを利用したラベル保存プロセスの改ページ)
create procedure XiaoZhengGe
@sqlstr nvarhar(4000)--検索文字列
@currentpage int、 --第Nページ
@pagesize int --各ページの行数
as
set nocount on
declare@P 1 int、 --P 1はランドマークのidです
@rowcount int
exec spursoropen@P 1 output、@sqlstr、@scrollot=1、@cctopt=1、@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize)as総ページ数--、@rowcount as総行数、@currentpage as現在ページ
set@currentpage=(@currentpage-1)*@pagesize+1
exec spucursorfetch@P 1,16、@currentpage、@pagesize
exec spucursorcelose@P 1
set nocount off
他の案:メインキーがないなら、臨時テーブルを使ってもいいし、案三で作ってもいいですが、効率は低いです。
最適化を提案する場合は、メインキーと索引を加えて、検索効率が向上します。
SQLで分析器を調べて、比較を示しました。私の結論は、改ページ案の二:(IDを利用してどれぐらい大きいかとSELECT TOP改ページより)効率が一番高いです。SQL文の改ページ案をつづり合わせる必要があります。(Not InとSELECT TOP改ページを利用して) 効率的には、SQL文の改ページ案の3つをつなぎ合わせる必要があります。(SQLを利用した游び标保存プロセスの改ページ) 効率は最悪ですが、一番通用します。
実際の状況の中で、具体的に分析します。
はい、ここでちょっと変な方法をください。
まずすべてのデータを読んで、あなたのウェブページのスクリプトプログラムでループします。記録が必要になるまで。
以下のJSPコード:
rs=state.executeQuery(「Select*from logo ugoods Where NuCLASSES ID=」+classide);
while(s.next(){
if('(pagenum-1)*pagesize){
contine;
)
if(i//レコードの読み込み、保存
)
else{
break;
)
)
ページごとにデータがあることは保証できますが、最後のページと最後のページの二ページが重複している可能性があります。
select*from(
select TOP 6*FROM(
SELECT TOP 6*
from logo gudods
Where NuCLASSES ID=1
ORDER BY NUGOOD S ID ASC)
as aSysTable
ORDER BY NUGOOD S ID DESC)
as bSysTable
ORDER BY N_GOODS_ID ASC
はい、すごいのを見つけます。
この転載は李洪根さんのブログから来ました。作者はマイクロソフトのMVPです。以下の3つの案を参考にして、実際の状況に合わせて選んでください。
テーブルを作成:
CREATE TABLE[TestTable](
[ID][int]IDENTITY(1,1)NOT NULL、
[First Name][nvarrhal](100)COLLATE Chinese euPRC CI_ASNULL、
[LastName][nvarrhar](100)COLLATE Chinese euPRC CI_ASNULL、
[Country][nvarrhal](50)COLLATE Chinese euPRC CI AS NULL、
[Note][nvarrhal](2000)COLLATE Chinese euPRC CI NULL
)ON[PRIMARY]
GO
挿入データ:(2万本以上、より多くのデータでテストすると明らかになります。)
SET IDENTITY_INSERT TestTable ON
declare@i int
set@i=1
while@i<=20000
begin
insert into TestTable([id],First Name,LastName,Country,Note)values(@i,'First NameuXXX','LastNameuXXX','Country_XXX','Noteu XXX')
set@i=@i+1
end
SET IDENTITY_INSERT TestTable OFF
-----------------------
改ページ案一:(Not InとSELECT TOPの改ページを利用する)語句形式:
SELECT TOP 10*
FROM TestTable
WHERE(ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOPページサイズ*
FROM TestTable
WHERE(ID NOT IN
(SELECT TOPページサイズ*ページ数id
FROM表
ORDER BY id))
ORDER BY ID
-----------------------
改ページ案二:(利用IDがどれぐらい大きいかとSELECT TOP分ページ)
ステートメント形式:
SELECT TOP 10*
FROM TestTable
WHERE(ID>
(SELECT MAX(id)
FROM(SELECT TOP 20 id
FROM TestTable
ORDER BY id)AS)
ORDER BY ID
SELECT TOPページサイズ*
FROM TestTable
WHERE(ID>
(SELECT MAX(id)
FROM(SELECT TOPページサイズ*ページ数id
FROM表
ORDER BY id)AS)
ORDER BY ID
-----------------------
改ページ案3:(SQLを利用したラベル保存プロセスの改ページ)
create procedure XiaoZhengGe
@sqlstr nvarhar(4000)--検索文字列
@currentpage int、 --第Nページ
@pagesize int --各ページの行数
as
set nocount on
declare@P 1 int、 --P 1はランドマークのidです
@rowcount int
exec spursoropen@P 1 output、@sqlstr、@scrollot=1、@cctopt=1、@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize)as総ページ数--、@rowcount as総行数、@currentpage as現在ページ
set@currentpage=(@currentpage-1)*@pagesize+1
exec spucursorfetch@P 1,16、@currentpage、@pagesize
exec spucursorcelose@P 1
set nocount off
他の案:メインキーがないなら、臨時テーブルを使ってもいいし、案三で作ってもいいですが、効率は低いです。
最適化を提案する場合は、メインキーと索引を加えて、検索効率が向上します。
SQLで分析器を調べて、比較を示しました。私の結論は、改ページ案の二:(IDを利用してどれぐらい大きいかとSELECT TOP改ページより)効率が一番高いです。SQL文の改ページ案をつづり合わせる必要があります。(Not InとSELECT TOP改ページを利用して) 効率的には、SQL文の改ページ案の3つをつなぎ合わせる必要があります。(SQLを利用した游び标保存プロセスの改ページ) 効率は最悪ですが、一番通用します。
実際の状況の中で、具体的に分析します。
はい、ここでちょっと変な方法をください。
まずすべてのデータを読んで、あなたのウェブページのスクリプトプログラムでループします。記録が必要になるまで。
以下のJSPコード:
rs=state.executeQuery(「Select*from logo ugoods Where NuCLASSES ID=」+classide);
while(s.next(){
if('(pagenum-1)*pagesize){
contine;
)
if(i
)
else{
break;
)
)
この方法は、廃棄されていると知っていますが、いったいどこに廃棄されているのか、牛たちに教えてもらいたいです。