该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-02-12
top 和order by 不是通用sql词语吗?
我只用过mssql, mysql,oracle都是最浅地用用。 |
|
返回顶楼 | |
发表时间:2004-02-12
order by 当然是标准 SQL,但是 top 不是。
|
|
返回顶楼 | |
发表时间:2004-02-12
dlee 写道 我就知道你要做这件事情。呵呵。
查一下 identity( 8 ) 这个函数,把数据取出存到临时表中,增加一个字段,值为 identity( 8 )。例如: select A0=identity( 8 ), A1, A2, A3 into tmptable from ... 然后从这个临时表中取数据,A0 就是临时表中的行号。A1、A2... 是表中的字段。 照上面的做的话,那只要在where中增加一个条件 A0<行号,就可以了吧(我没有用过,只是分析可能是这个样子,不知道了解得对不对)。 where A0<行号 ,其实这个 行号 就是你想要的一页的记录数目. 这个数据库我没有用,oracle 是不支持 top 的(至少8i是这样,后版本我没有用过),支持 rownum ,不过用它分页时要小心,因为它不是先 order by 的. |
|
返回顶楼 | |
发表时间:2004-02-12
你分析的是对的,就是这样做,很简单的。
用 Oracle 的话可以直接使用 rownum,根本不需要建立临时表。 |
|
返回顶楼 | |
发表时间:2004-02-12
是这样吗?
select ID_NUM=IDENTITY(10),* INTO #tmpt FROM WT_1 WHERE ID_NUM <= 10 会抛出以下错误: com.sybase.jdbc2.jdbc.SybSQLException: Invalid column name 'ID_NUM'. at com.sybase.jdbc2.tds.Tds.processEed(Tds.java:2636) at com.sybase.jdbc2.tds.Tds.nextResult(Tds.java:1996) at com.sybase.jdbc2.jdbc.ResultGetter.nextResult(ResultGetter.java:69) at com.sybase.jdbc2.jdbc.SybStatement.nextResult(SybStatement.java:204) at com.sybase.jdbc2.jdbc.SybStatement.nextResult(SybStatement.java:187) at com.sybase.jdbc2.jdbc.SybStatement.queryLoop(SybStatement.java:1537) at com.sybase.jdbc2.jdbc.SybStatement.executeQuery(SybStatement.java:1522) at com.sybase.jdbc2.jdbc.SybPreparedStatement.executeQuery(SybPreparedStatement.java:72) at DataBaseUtil.main(DataBaseUtil.java:34) |
|
返回顶楼 | |
发表时间:2004-02-12
这是我从网上别处找到的,应该是用存储过程实现的:
set rowcount 10*(@page-1) go select id into #temp from tb_writ go set rowcount 10 go select * from tb_writ where id not in (select id from #temp.id) go set rowcount 0 只是我想用纯代码(JAVA)实现,这样程序的移植性和维护性会好些. 我实在是没办法了,烦了我很长时间了,真是不知道该怎么整了. 还请再帮我想想办法啊!! |
|
返回顶楼 | |
发表时间:2004-02-13
ID_NUM 是数据到了临时表中才有的字段,你这样查当然会出问题。
select ID_NUM=IDENTITY(10);,* INTO #tmpt FROM WT_1 WHERE ID_NUM <= 10 你要分两步来做: select ID_NUM=IDENTITY(10);,* INTO #tmpt FROM WT_1 select * from #tmpt WHERE ID_NUM <= 10 如果相同的查询很多,为了提高性能,需要把临时表保留一段时间。这时候注意还要为临时表的数据加上时间戳,定一个期限,过期后要重新生成这些数据。不过也可以在做完全部查询后立刻删除临时表。 |
|
返回顶楼 | |
发表时间:2004-02-13
TO dlee:
谢谢DLEE!该问题已经解决。在这再请教一下: 1.一个#号应该是即时的吧,也就是当我把这个连接CLOSE时,这个表就释放了吧(立刻删除)? 2.象你所说,如果给临时表的数据加上时间戳,请问是不是只能在数据库里进行设置?可以用代码动态设置吗?又如何设置? 3.两个##号是全局临时表,存在一个SESSION中,请问这个SESSION的生命周期是多长(是否是一个用户的生命周期)? |
|
返回顶楼 | |
发表时间:2004-02-15
tlink 写道 1.一个#号应该是即时的吧,也就是当我把这个连接CLOSE时,这个表就释放了吧(立刻删除)?
2.象你所说,如果给临时表的数据加上时间戳,请问是不是只能在数据库里进行设置?可以用代码动态设置吗?又如何设置? 3.两个##号是全局临时表,存在一个SESSION中,请问这个SESSION的生命周期是多长(是否是一个用户的生命周期)? 临时表分为两类:可共享的和不可共享的。不可共享临时表在由 create table 中将符号 # 置于表名之前创建;可共享临时表通过 create table 中指定表名前缀 tempdb.. 而创建。不可共享临时表生命周期为创建临时表的连接,一旦连接关闭,临时表就会被丢弃。可共享临时表将一直存在于数据库中,直到 Sybase 重新启动。你说的那个 ## 的用法我在 Sybase 中从来没有用到过。 给数据加时间戳就是给临时表加一个时间戳字段,值为数据生成的时间。我不知道你说的代码动态设置是什么意思,也不知道该如何设置。 |
|
返回顶楼 | |
发表时间:2004-02-17
不知道可以不可以一步来呢??像如下:
SELECT * FROM (SELECT IDENTITY(10); as rowNumber,字段 FROM 表 WHERE 条件 ); as temp WHERE temp.rowNumber>=开始 and temp.rowNumber<=结束 另外,如果用了连接池的话,那个所谓的如下: 引用 不可共享临时表生命周期为创建临时表的连接,一旦连接关闭,临时表就会被丢弃
会不会有麻烦呢?? |
|
返回顶楼 | |