Office中国论坛/Access中国论坛

标题: 如何取后50条记录? [打印本页]

作者: xingzhihao    时间: 2012-12-17 22:22
标题: 如何取后50条记录?
1000条记录,我用top50取到了前50条记录,但是不知道怎么从后边取50条记录,求SQL语句,请教各位了,谢谢!
切记不能用倒序啊!
作者: chaosheng    时间: 2012-12-17 22:47
本帖最后由 chaosheng 于 2012-12-17 22:49 编辑

在原来的排序条件上用降序再同样取top50啊,还没看后半句就回了,见笑了.但可再在取出来后再把排序调整回来啊
作者: xingzhihao    时间: 2012-12-18 08:54
感谢侠客帮助!
我需要的效果是直接取,不能二次排序。请出手帮助
作者: zhuyiwen    时间: 2012-12-18 09:33
有点意思的说法,好像是分页取数据,顶一个。
作者: zhuyiwen    时间: 2012-12-18 09:35
顺便问一下,原始数据有主键吗?
主键是单一主键,还是复合主键?
作者: zhuyiwen    时间: 2012-12-18 09:52
假设有一主键为ID
那第一次取了 50 个ID
SELECT TOP 50 ID FROM yourData

第二次取50个ID
SELECT TOP 50 ID FROM yourData WHERE ID NOT IN (SELECT TOP 50 ID FROM yourData)

第三次取50个ID
SELECT TOP 50 ID FROM yourData WHERE ID NOT IN (SELECT TOP 100 ID FROM yourData)

第N次取50个ID
SELECT TOP 50 ID FROM yourData WHERE ID NOT IN (SELECT TOP 50 * (N-1) ID FROM yourData)
作者: zhuyiwen    时间: 2012-12-18 09:56
第N次取50个ID 对应的记录
  1. SELECT o.* FROM
  2.    (SELECT TOP 50 ID FROM yourData WHERE ID NOT IN (SELECT TOP 50 * (N-1) ID FROM yourData)) AS i INNER JOIN yourData AS o ON i.ID=o.ID
复制代码

作者: 鑨蘢瀧爖壟    时间: 2012-12-18 10:11
select * from [表名] where not [主键] in (select top 9950 * from [表名] order by [主键])  这样可以吗?
作者: zhuyiwen    时间: 2012-12-18 10:19
鑨蘢瀧爖壟 发表于 2012-12-18 10:11
select * from [表名] where not [主键] in (select top 9950 * from [表名] order by [主键])  这样可以吗 ...

好!
还是人多力量大!
精简得好,哈哈

不过有点错
应该是
  1. select * from [表名] where [主键] not in (select top 9950 [主键] from [表名])
复制代码

作者: 鑨蘢瀧爖壟    时间: 2012-12-18 10:25
zhuyiwen 发表于 2012-12-18 10:19
好!
还是人多力量大!
精简得好,哈哈

对,都是朱总厉害,我都感觉怪怪的
作者: xingzhihao    时间: 2012-12-18 13:42
朱总出手谁与争锋?感谢朱总感谢龙!
作者: todaynew    时间: 2012-12-18 16:37
NOT IN 速度应该比较慢,二楼的方法可能更优一些。
作者: todaynew    时间: 2012-12-18 16:43
本帖最后由 todaynew 于 2012-12-18 17:05 编辑
鑨蘢瀧爖壟 发表于 2012-12-18 10:11
select * from [表名] where not [主键] in (select top 9950 * from [表名] order by [主键])  这样可以吗 ...

既然已经找到9950了,干嘛还要not in?大于9950不就完事了。

select * from tbname where dcount("*","tbname","ID<=" & ID)>9950

实际上9950不是必要的,可以写为:

select * from tbname where dcount("*","tbname","ID<=" & ID)>(dcount("*","tbname")-50)

不过域函数、子查询、in运算速度都比较慢。还是先逆序top 50 ,再顺序一下为好。
作者: t小宝    时间: 2012-12-18 20:25
比较热闹呀,我也来一个,如果不充许倒序,是否这个速度快一点:
  1. SELECT 表1.*
  2. FROM 表1 LEFT JOIN (SELECT TOP 950 表1.自动编号 FROM 表1) AS 子查询 ON 表1.自动编号 = 子查询.自动编号
  3. WHERE (((子查询.自动编号) Is Null));
复制代码

作者: zhuyiwen    时间: 2012-12-18 23:07
不会你们所想的ID都是自动编号吧?而还是中间没有删除ID的?
作者: wufeng980114    时间: 2012-12-19 08:13
本帖最后由 wufeng980114 于 2012-12-19 08:25 编辑

哈哈,集思广益啊,很多曲线救国的思路啊。如zhuyiwen所述,如果中间的ID不连续怎么办?我一般是表中设置两个ID,一个给用户看的,一个自己编程用,(当然也可以根据情况只使用一个ID,这个ID不是自动编号的),每次表更新(如:删除记录)时,就把自己的ID重新排序,保证ID不间断,这样可能会比较麻烦,影响速度,但也能解决问题。
"SELECT * FROM  yourData  where 自己的id > 950"
作者: todaynew    时间: 2012-12-19 11:20
本帖最后由 todaynew 于 2012-12-19 11:22 编辑
zhuyiwen 发表于 2012-12-18 23:07
不会你们所想的ID都是自动编号吧?而还是中间没有删除ID的?

编号是什么数据类型,是否存在断号,都不影响。只要id是增长的,而不是随机的就行。
作者: ycxchen    时间: 2012-12-19 11:59
比较同意老汉的观点,要是记录不是1000条就不好办。
作者: chaosheng    时间: 2012-12-19 23:28
哎,这个问题没什么意义. 感觉Access子查询很慢的. 不知这个是否在网络多用户更新没有呢. 如果多用户更新,一切都毫无意义的. 只不过1千条记录嘛,要分开它干嘛呢.
作者: 轻风    时间: 2012-12-20 11:53
老汉的方法挺有意思
作者: huangli0356    时间: 2012-12-25 08:34
学习了..大师之思路果然与众不同...支持下..
作者: zhuyiwen    时间: 2012-12-26 19:17
t小宝 发表于 2012-12-18 20:25
比较热闹呀,我也来一个,如果不充许倒序,是否这个速度快一点:
  1. SELECT 表1.*
  2. FROM 表1 LEFT JOIN (SELECT TOP 950 表1.自动编号 FROM 表1) AS 子查询 ON 表1.自动编号 = 子查询.自动编号
  3. WHERE (((子查询.自动编号) Is Null));
复制代码
我来整理一下

第N次取50个ID
SELECT TOP 50 y.*
FROM yourData AS y LEFT JOIN (SELECT TOP 50 * (N-1) ID FROM yourData) AS b ON y.ID = b.ID
WHERE b.ID Is Null;

红字,由 VBA 生成。
作者: 笑嘻嘻哦    时间: 2013-1-27 18:46
五十条记录能说明什么呢



























欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3