我有一个Access97数据库(不幸),我通过ODBC查询它。在Access97 SQL中,如何返回一系列行?
我想构造一个查询,它将返回J J开始于偏移量K的有序行。现在,对于相关操作,我使用了子查询和TOP关键字,这工作正常,但我不认为我可以将其用于我尝试执行的这一新操作。我想这样做,因为我想为某些软件添加某种形式的分页。
理想情况下,用户界面应该能够说,给我50条记录,从记录150开始,按日期列排序。
任何帮助,将不胜感激。
我有一个Access97数据库(不幸),我通过ODBC查询它。在Access97 SQL中,如何返回一系列行?
我想构造一个查询,它将返回J J开始于偏移量K的有序行。现在,对于相关操作,我使用了子查询和TOP关键字,这工作正常,但我不认为我可以将其用于我尝试执行的这一新操作。我想这样做,因为我想为某些软件添加某种形式的分页。
理想情况下,用户界面应该能够说,给我50条记录,从记录150开始,按日期列排序。
任何帮助,将不胜感激。
你基本上试图在Access中模仿ROW_NUMBER()。不幸的是,Access不是做这种事情的好引擎。经过一百次左右的记录后它会变得很慢。
随着中说,这里是你可以做什么:
SELECT t1.ID, t1.SomeText, t1.SomeDate,
(
SELECT COUNT(*) + 1
FROM Table1 AS t2
WHERE t1.SomeText > t2.SomeText
) as RowNumber
FROM Table1 t1
ORDER BY t1.SomeText
这会产生这种结果集(在我的特别表):
ID | SomeText | SomeDate | RowNumber
10 | 4NGJN | 1/20/2010 | 1
11 | ABH | 1/20/2010 | 2
2 | asldkfj | 1/20/2010 | 3
1 | asldkfjaslgh | 1/20/2010 | 4
7 | ewoiuhdkjnlbkjbn | 1/20/2010 | 5
4 | oihkjldhnlkmdfn,mn | 1/20/2010 | 6
3 | oihoih | 1/20/2010 | 7
5 | qwwern | 1/20/2010 | 8
8 | SKN | 1/20/2010 | 9
9 | WEOIN | 1/20/2010 | 10
6 | wetrhn | 1/20/2010 | 11
12 | XDNKJ | 1/20/2010 | 12
我会做在访问已保存的查询(一在SQL Server中查看),然后在您的应用程序中写入如下查询:
SELECT ID, SomeText, SomeDate, RowNumber
FROM myView
WHERE RowNumber > 5
AND RowNumber < 11
当然,“5”&您可以从您的客户端应用传入“11”,并且将基于您所在的特定页面。 (它可能会是50和100或你的东西)。
我很害怕!嘿...(枚举他们,然后使用>,<)非常感谢! – Jotham 2010-01-19 06:40:56
第二个查询适用于我。谢谢! – 2014-01-02 07:02:50
您可以使用TOP与未中和顶子查询:
SELECT TOP n ... ID Not In (SELECT TOP k ...)
它可能会快于尝试的行数在Access
请记住,在Jet/ACE中,NOT IN不可靠,无法优化查询以在条件的两侧使用索引。当我的经验是有效率的时候,这是不可预测的。 – 2010-01-19 20:39:50
你能解释一下你有什么问题TOP关键字?这听起来像对我来说是正确的解决方案! – Birger 2010-01-19 08:38:07
TOP只给你一组相对于数据集的开始或结束。它不会给你一个给定偏移的切片。内森的回答如下解释它。 – Jotham 2010-01-19 09:22:38
由于Jet/ACE缺少LIMIT关键字,因此TOP是唯一可行的方法,并且可能效率非常低,并且需要过程代码来构建SQL。 – 2010-01-19 20:38:41