2010-01-19 44 views
3

我有一个Access97数据库(不幸),我通过ODBC查询它。在Access97 SQL中,如何返回一系列行?

我想构造一个查询,它将返回J J开始于偏移量K的有序行。现在,对于相关操作,我使用了子查询和TOP关键字,这工作正常,但我不认为我可以将其用于我尝试执行的这一新操作。我想这样做,因为我想为某些软件添加某种形式的分页。

理想情况下,用户界面应该能够说,给我50条记录,从记录150开始,按日期列排序。

任何帮助,将不胜感激。

+0

你能解释一下你有什么问题TOP关键字?这听起来像对我来说是正确的解决方案! – Birger 2010-01-19 08:38:07

+0

TOP只给你一组相对于数据集的开始或结束。它不会给你一个给定偏移的切片。内森的回答如下解释它。 – Jotham 2010-01-19 09:22:38

+0

由于Jet/ACE缺少LIMIT关键字,因此TOP是唯一可行的方法,并且可能效率非常低,并且需要过程代码来构建SQL。 – 2010-01-19 20:38:41

回答

3

你基本上试图在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或你的东西)。

+0

我很害怕!嘿...(枚举他们,然后使用>,<)非常感谢! – Jotham 2010-01-19 06:40:56

+0

第二个查询适用于我。谢谢! – 2014-01-02 07:02:50

2

您可以使用TOP与未中和顶子查询:

SELECT TOP n ... ID Not In (SELECT TOP k ...) 

它可能会快于尝试的行数在Access

+0

请记住,在Jet/ACE中,NOT IN不可靠,无法优化查询以在条件的两侧使用索引。当我的经验是有效率的时候,这是不可预测的。 – 2010-01-19 20:39:50

相关问题