亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 版本12.5.2,分頁取數(shù)據(jù)的sql怎么寫?誰能幫我 [打印本頁]

作者: iim_liyongfeng    時間: 2005-12-13 14:23
標題: 版本12.5.2,分頁取數(shù)據(jù)的sql怎么寫?誰能幫我
版本12.5.2,分頁取數(shù)據(jù)的sql怎么寫?
作者: leno_mx    時間: 2005-12-13 16:14
不明白什么意思?
作者: iim_liyongfeng    時間: 2005-12-13 16:23
標題: 取第11條到第20條的記錄
取第11條到第20條的記錄:
象mysql一樣,select * from table where c1='a' start 11 limit 10
作者: flybean    時間: 2005-12-13 17:29
set rowcount 20
-- get 20 rows
-- discard the first 10 rows
set rowcount 0
作者: ncowboy    時間: 2005-12-13 18:18
原帖由 flybean 于 2005-12-13 17:29 發(fā)表
set rowcount 20
-- get 20 rows
-- discard the first 10 rows
set rowcount 0


不能夠設置起始位置啊。哥哥。
作者: ncowboy    時間: 2005-12-13 18:20
可是,這個不能夠用。
顯式限制查詢返回的行數(shù)

--------------------------------------------------------------------------------

您可以使用 FIRST 或 TOP 關鍵字限制查詢的結(jié)果集中包括的行數(shù)。這些關鍵字用于包括 ORDER BY 子句的查詢。

示例
以下查詢返回在按姓氏對雇員進行排序時首先出現(xiàn)的雇員的信息:

SELECT FIRST *
FROM employee
ORDER BY emp_lname
以下查詢返回按姓氏排序時出現(xiàn)的前五個雇員:

SELECT TOP 5 *
FROM employee
ORDER BY emp_lname
在使用 TOP 時,您也可以使用 START AT 來提供偏移。以下語句列出按姓氏以降序進行排序時出現(xiàn)的第五個和第六個雇員:

SELECT TOP 2 START AT 5 *
FROM employee
ORDER BY emp_lname DESC
FIRST 和 TOP 只能與 ORDER BY 子句聯(lián)合使用,以確保獲得一致的結(jié)果。如果使用 FIRST 或 TOP 時沒有 ORDER BY,則會觸發(fā)語法警告,并且很可能產(chǎn)生無法預知的結(jié)果。

注意
'start at' 值必須大于 0。當 'top' 為常量時,其值必須大于 0;當 'top' 為變量時,其值必須大于或等于 0。

作者: zhhui2000    時間: 2005-12-13 18:38
SYBASE 不提供這種方式的提取,除非自己寫一個游標
作者: iim_liyongfeng    時間: 2005-12-13 19:33
top 語句不行啊

1> select top 10 * from tblStudentCode order by Code
2> go
Msg 102, Level 15, State 1:
Server 'DBSVR', Line 1:
Incorrect syntax near '10'.
作者: jarjar    時間: 2005-12-13 21:47
top語句在12.5.3之后才支持,實際上使用set rowcount n是個不錯的選擇
作者: leno_mx    時間: 2005-12-14 10:18
top在ASE 15可以支持,但不知道start at支不支持?
作者: hannibal    時間: 2005-12-14 16:51
一段很好的分頁程序,速度很快,sybase內(nèi)部員工寫的,改成自己需要的SQL吧。

create procedure test_p @ipage int, @num int as   /* @ipage  頁碼, @num 每頁的記錄數(shù) */
begin
        declare @maxpages int, @rcount int   /* @maxpages 最大頁碼 */
        if @ipage>=100
                select @maxpages=ceiling(count(*)/@num) from test
        else
                select @maxpages=100000
        if @ipage<=@maxpages/2
        begin
                select @rcount=@ipage*@num
                set rowcount @rcount
                select id=identity(12),name,descs,ddd into #temptable1 from test order by id
                select * from #temptable1  where id>=(@ipage-1)*@num and id<= @ipage*@num
        end else
        begin
                select @rcount=(@maxpages-@ipage+1)*@num
                set rowcount @rcount
                select id=identity(12),name,descs,ddd into #temptable2 from test order by id desc
                select id,name, ddd,descs from #temptable2  where id>=(@maxpages-@ipage)*@num and id<= (@maxpages-@ipage+1)*@num                         order by id  desc
        end
end
作者: hannibal    時間: 2005-12-14 17:38
好事做到底,送個通用版吧

create procedure splitpage @qry varchar(16384),@ipage int, @num int as   /*@qry SQL語句, @ipage 頁數(shù), @num 每頁記錄條數(shù) */
begin
        declare @maxpages int
        declare @rcount int
        declare @execsql varchar(16384)

        if @ipage>=100
                select @maxpages=ceiling(count(*)/@num) from test
        else
                select @maxpages=100000
        if @ipage<=@maxpages/2
        begin
                select @rcount=@ipage*@num
                set rowcount @rcount
                set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')
                set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')
                set @execsql = @execsql || ' select * from #temptable1  where sybid>' || convert(varchar,(@ipage-1)*@num) || ' and sybid <= ' || convert(varchar,@ipage*@num)
                execute (@execsql)

        end else
        begin
                select @rcount=(@maxpages-@ipage+1)*@num
                set rowcount @rcount
                set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')
                set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')
                set @execsql = @execsql || ' order by sybid desc'
                set @execsql = @execsql || ' select * from #temptable1 where sybid > ' || convert(varchar,(@maxpages-@ipage)*@num) || ' and sybid <= ' || convert(varchar,(@maxpages-@ipage+1)*@num)
                execute (@execsql)
        end
end
作者: vct00    時間: 2005-12-15 08:28
>select id=identity(12),name,descs,ddd into #temptable1 from test order by id
>select * from #temptable1  where id>=(@ipage-1)*@num and id<= @ipage*@num
我在項目中也是使用這個模式的,問題是寫臨時表時是否會發(fā)生物理寫操作?如果發(fā)生,還有沒有不需要寫臨時表的方案?
作者: ncowboy    時間: 2005-12-15 18:39
原帖由 hannibal 于 2005-12-14 17:38 發(fā)表
好事做到底,送個通用版吧

create procedure splitpage @qry varchar(16384),@ipage int, @num int as   /*@qry SQL語句, @ipage 頁數(shù), @num 每頁記錄條數(shù) */
begin
        declare @maxpages int
        ...

18:38:25.968        DBMS        sybase@jasmine -- Error:  Number (102) Severity (15) State (1) Server (Jasmine) Procedure (splitpage) 在 '@execsql'附近有不正確的語法。 (42000), Batch 1 Line 15
18:38:25.984        DBMS        sybase@jasmine -- Error:  Number (102) Severity (15) State (1) Server (Jasmine) Procedure (splitpage) 在 '@execsql'附近有不正確的語法。 (42000), Batch 1 Line 24
作者: hannibal    時間: 2005-12-16 11:18
vc00, sybase中的臨時表當用select into #table的形式時,是不記錄日志的。速度非常快。
這點和oracle不同。算是sybase的一個feature.

ncowboy ,老程序在處理10萬頁以上結(jié)果集會出現(xiàn)問題。用select @maxpages=ceiling(count(*)/@num) from test此處使用是不對的。
由于即席查詢時獲取maxpages效率不高,對此作以下修改:可以由用戶指定最大查詢頁數(shù),缺省定為5000

create procedure splitpage @qry varchar(16384),@ipage int, @num int,@maxpages int = 5000 as  
/*@qry SQL語句, @ipage 頁數(shù), @num 每頁記錄條數(shù), @maxpages 最大查詢頁數(shù) */
begin

        declare @rcount int
        declare @execsql varchar(16384)

        if @ipage > @maxpages
        begin
              select '輸入頁數(shù)[' || convert(varchar,@ipage) || ']大于最大查詢頁數(shù)[' ||  convert (varchar,@maxpages) ||']'
              return
        end

        select @rcount=@ipage*@num
        set rowcount @rcount
        set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')
        set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')
        set @execsql = @execsql || ' select * from #temptable1  where sybid>' || convert(varchar,(@ipage-1)*@num) || ' and sybid <= ' || convert(varchar,@ipage*@num)
        execute (@execsql)
end

由于無法精確且高效取出即席查詢結(jié)果集的總頁數(shù),原程序中考慮后幾頁查詢的優(yōu)化算法就無法使用了。
如果可以先算出精確的總頁數(shù),然后作為參數(shù)傳給splitpage,那么也可以把查詢后幾頁的算法再補上。

誰有更好的辦法也可以提出來大家一起把這個分頁存儲過程優(yōu)化到底。
作者: vct00    時間: 2005-12-16 11:57
我在測試 select id=identity(12),name,descs,ddd into #temptable1 from test order by id 時,
系統(tǒng)提示:
Total writes for this command: 16
這里是否指物理寫操作呢?
作者: 欣語欣愿    時間: 2005-12-22 12:00
原帖由 leno_mx 于 2005-12-14 10:18 發(fā)表
top在ASE 15可以支持,但不知道start at支不支持?



不行,top不能在ASE 15上使用,我覺得應該先定義游標!這樣作速度快,而且穩(wěn)定!
作者: leno_mx    時間: 2005-12-22 16:35
樓上用游標是最慢的呀。怎么快啊?top怎么在ASE15上不行。你怎么寫的sql?
作者: networkiller    時間: 2006-04-05 00:10
標題: mysql
select * from 表名 (where條件) limit 10,20;
作者: hannibal    時間: 2006-04-24 11:20
版本更新:1.0.2
注意程序最后要加上set rowcount 0

create procedure splitpage @qry varchar(16384),@ipage int, @num int,@maxpages int = 5000 as  
/*@qry SQL語句, @ipage 頁數(shù), @num 每頁記錄條數(shù), @maxpages 最大查詢頁數(shù) */
begin

        declare @rcount int
        declare @execsql varchar(16384)

        if @ipage > @maxpages
        begin
              select '輸入頁數(shù)[' || convert(varchar,@ipage) || ']大于最大查詢頁數(shù)[' ||  convert (varchar,@maxpages) ||']'
              return
        end

        select @rcount=@ipage*@num
        set rowcount @rcount
        set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')
        set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')
        set @execsql = @execsql || ' select * from #temptable1  where sybid>' || convert(varchar,(@ipage-1)*@num) || ' and sybid <= ' || convert(varchar,@ipage*@num)
        execute (@execsql)
        set rowcount 0
end
作者: willbeike    時間: 2007-11-22 11:10
存儲過程應該如何調(diào)用。扛懔税胩觳恢廊绾问褂,郁悶!謝謝了
作者: mcolinc    時間: 2008-02-21 20:32
創(chuàng)建表的時候設置一個identity的欄位
這樣就可以做到分頁取數(shù)據(jù)了
作者: aliking    時間: 2008-02-26 20:41
同意17樓的觀點,用游標更好一些。
用臨時表算法的空間復雜度是O(n),如果表很大或沒有預存在Cache中,所用的I/O時間就非?捎^了。
用游標定位到指定的頁,空間復雜度應該是O(1),雖然游標遍歷記錄比直接用Select稍慢一點,但考慮到分頁應用中,每次只讀取一頁的內(nèi)容,所以這個時間性能上的損失可以忽略。
作者: gelyon    時間: 2011-11-18 13:59
雖然這個帖子已經(jīng)很久了,但是小弟現(xiàn)在遇到個關于sybase臨時表分頁的問題,對于兩個結(jié)果集union 后分頁不正確。
例如:
SELECT row_num=identity(16),tmpData.* into #tmptalbe from
(
SELECT ACCOUNT_ID ,CARD_ID FROM T_ACCOUNT_CARD
UNION ALL
SELECT USER_ID,ROLE_ID FROM T_USER_ROLE
) tmpData
select * from #tmptalbe
--where row_num>=convert(int,1) and row_num<=convert(int,20)
drop table #tmptalbe


這樣分頁后不正確,因為union all 后面第二個結(jié)果集沒有被分配row_num,始終是0,導致我分頁不正確。

我嘗試改寫union all寫法, 用full join 來實現(xiàn),但是測試時才發(fā)現(xiàn)sybase居然不支持full join,郁悶到了。。
SELECT
        CASE WHEN A.ACCOUNT_ID IS NULL THEN B.USER_ID ELSE A.ACCOUNT_ID END ID1,
        CASE WHEN A.CARD_ID IS NULL THEN B.ROLE_ID ELSE A.CARD_ID END ID2
FROM T_ACCOUNT_CARD A FULL JOIN T_USER_ROLE B ON 1=2

另外我也測試了用視圖來做,結(jié)果也不行,視圖中用UNION ALL 連接的兩個結(jié)果集,第二個結(jié)果集還是沒有ROW_NUM,始終為0,導致sybase臨時表分頁也不正確。

CREATE VIEW V_TEST  AS(
        SELECT ACCOUNT_ID ,CARD_ID FROM T_ACCOUNT_CARD
        UNION ALL
        SELECT USER_ID,ROLE_ID FROM T_USER_ROLE
)


SELECT row_num=identity(16),tmpData.* into #tmptalbe from
(
SELECT * FROM V_TEST
) tmpData
select * from #tmptalbe
--where row_num>=convert(int,1) and row_num<=convert(int,20)
drop table #tmptalbe


請問怎么來結(jié)果這個分頁查詢不正確,到底union all 后的第二個結(jié)果集為什么row_num始終是0,而不是遞增的順序值呢?
作者: epstar    時間: 2012-10-27 17:26
一樓的位置好啊..
作者: Eisen    時間: 2012-10-28 14:00
本帖最后由 Eisen 于 2012-10-28 14:00 編輯
gelyon 發(fā)表于 2011-11-18 13:59
雖然這個帖子已經(jīng)很久了,但是小弟現(xiàn)在遇到個關于sybase臨時表分頁的問題,對于兩個結(jié)果集union 后分頁不正 ...

那換個寫法呢--
create table #tmptable (row_num int identity,account_id varchar( 8 ),card_id varchar(20))
go
insert #tmptable
SELECT ACCOUNT_ID ,CARD_ID FROM T_ACCOUNT_CARD
UNION ALL
SELECT USER_ID,ROLE_ID FROM T_USER_ROLE

select * from #tmptable  where row_num>=convert(int,1) and row_num<=convert(int,20)
作者: 2BeSybPro    時間: 2012-10-30 00:14
我n年前寫過一個通用的分頁程序,見下面鏈接。
http://72891.cn/forum.p ... p;page=1#pid3779459

用tempdb作為staging area,一定注意別把tempdb填滿了。Temp table 最好建索引,插入temp table的語句一定要用index scan,否則會在tempdb中hold transaction而引起tempdb space issue。
作者: wang_xue_m    時間: 2012-10-30 09:03
樓主,用BCP可以設置起始




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2