如何查询第 11-20 条记录?(100分)

  • 主题发起人 主题发起人 zwhc
  • 开始时间 开始时间
select top 20 * from table1
where a1 not in
(select a1 from
(select top 10 * from table1)
)
这里假设字段a1为表table1的值唯一的字段
 
是条新思路,但有个小 bug:返回的结果集为 20 条记录
 
//faint!!
我的贴子你们都没看到?555~~~~~~~~
 
看到了,怎么没给答复? sorry

我从来没用过 ADO,没想到还有这种妙用,真不错。

soho 的贴子刚好解决了“不 order by 主码的情况”,
所以我说是条新思路。
 
>>soho 的贴子刚好解决了“不 order by 主码的情况”,

怎么可能呢?他那是根本没有order,和我说的“不 order by 主码的情况”
根本不是一回事,我是指order by field1,field2,...,或者
order by fieldA,但fieldA不是主码。

如果没有order,top有什么意义呀!
 
to 温柔一刀:
哦,是这样的。如果 fieldA 是 talbe1 中值唯一的字段
(fieldA 可以是由多个字段构成的复合字段),那么用
"... fieldA not in (select fieldA ...)..." 就可以解决
“不 order by 主码的情况”,soho 在贴子里没说,但我
确实是因为他的贴子而想到这种用法的。

比如以下例子(数据库是 pubs):
select top 5 *
from employee
where emp_id not in
(select e1.emp_id from
(select top 5 * from employee order by job_id) e1)
order by job_id
=============================
to LGXing:
thanks.
 
复合字段的合适例子一时找不到,先用
“convert(char,emp_id)+minit”代替吧。

select top 5 *
from employee
where convert(char,emp_id)+minit not in
(select convert(char,e1.emp_id)+minit from
(select top 5 * from employee order by job_id) e1)
order by job_id
 
if use ADOQuery:
////====记录排序====
with ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('Select * from 表名 order by 字段 asc');
Open;
end;

////===取记录======
ADOQuery1.moveby(记录数)

是否符合题意?^O^
 
select top 20 * from employee where fieldx not in
(select top 10 fieldx from employee order by fieldx) order by fieldx
先获得前20条记录,然后从这二十条记录中将前十条记录剔除。
前提是保证fieldx是主关键字。如果不是,则假设主关键字为"MyId",将上面
的SQL 语句改写为
select top 20 * from employee where MyId not in
(select top 10 MyId from employee order by fieldx) order by fieldx

因为使用了子查询,所以效率肯定会受影响。尤其是大数据集中取数。
 
算了算了,不说了,难道我的表达能力真的那么差,就想老猫说的?

不过我还是认为你们的理解能力太差,我说的话你们从来不一字一句看清楚,
真不知道你们是怎么编程序的。

>>但我确实是因为他的贴子而想到这种用法的
我的贴子在它的之前,并且已经明确给出了这种用法,真不知道你在说什么。

byebye,这道题我不再讨论了,分数也不要给我,谢谢。
 
to 温柔一刀:
你的“来自:温柔一刀 时间:00-10-8 22:53:07 ID:360126 ”
贴子里强调“在不order by 主码的情况下,简单用SQL语句是不可能的,”

select top 3 * from employee where emp_id not in
(select top 10 emp_id from employee order by emp_id) order by emp_id

而后我从 soho 的贴子联想到可以不“order by 主码”,
在我的“来自:zwhc 时间:00-10-10 16:06:36 ID:361953 ”
贴子里 order by 的是 job_id,而不是 emp_id.

select top 3 * from employee where emp_id not in
(select top 10 emp_id from employee order by job_id) order by job_id
~~~~~~ ~~~~~~
 
我问过ms的人了,没有直接的办法,一定要变通才行
 
原以为可以在 Query Amalyzer 上执行游标函数,
所以想弄懂其用法后结束本问。结果发现这么一段
话“这些 API 函数都有一些选项和功能(例如定义
游标的宽度,即行数)。这些功能不能用
Transact-SQL 游标的语法表示”。眼睛直接花掉。

那么,只能通过相应的编程环境来调用它了。不研
究了。就此结束本问吧。
=====================================
温柔一刀:你的帮助最大,分数呢,你就要了吧。如
有得罪之处,请多见谅。
 
多人接受答案了。
 
分数无所谓,关键是你就是不仔细看我说的话!!!!!

>>ps:在order by主码的情况下,你们上面写的也太麻烦了,这样就可以:
>>select top 3 * from employee where emp_id not in
>>(select top 10 emp_id from employee order by emp_id) order by emp_id
>>在不order by 主码的情况下,简单用SQL语句是不可能的,只能用ADO的方式。

我这里说得很明白,我的语句是“在order by主码的情况下”!!!

而在不order by主码的情况下,是不可能的,你的那句
“select top 3 * from employee where emp_id not in
(select top 10 emp_id from employee order by job_id) order by job_id”

根本是错误的,只能产生不可预料的结果(如果job_id是可以重复的话)

ps:我的分数本来已经成为整数了,你这一来,又变成1了 :-)
 
TO 温柔一刀:
我用了ADO的RecordSet.PageSize
但是在OPEN的时候报错,请教这是为何,或者
可以发个DEMO给我看看嘛,谢谢啦
 
oracle支持top n吗?
 
后退
顶部