1

我尝试使用以下查询获取表的最后一行和下一行:

SELECT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC
UNION 
SELECT TOP 2 Nummer FROM Empfänger WHERE Nummer >= 4748 ORDER BY Nummer ASC;

主键“Nummer”是唯一的并且是自增的,所以有

4747, 4748, 4749

它应该恕我直言返回上述数字,而是返回:

4747, 4798, 4799

当我使用 Access 打开数据库并将过滤器设置为“之间”时,值会正确显示。

我将声明更改为:

SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC
UNION 
SELECT DISTINCT Nummer FROM Empfänger WHERE Nummer = 4748 
UNION 
SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer > 4748 ORDER BY Nummer ASC;

这几乎完美无缺。

4747, 4748, 4750

当我在单个查询中编写每个语句时,它会返回正确的值......

SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC
= 4747
SELECT DISTINCT Nummer FROM Empfänger WHERE Nummer = 4748 
= 4748
SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer > 4748 ORDER BY Nummer ASC;
= 4749

\

SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4750 ORDER BY Nummer DESC
UNION 
SELECT DISTINCT Nummer FROM Empfänger WHERE Nummer = 4750 
UNION 
SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer > 4750 ORDER BY Nummer ASC;

我再次检查了一下,突然上面显示的查询起作用了。感谢您的帮助。

4

2 回答 2

4

Access 使用 JET 引擎。似乎ORDER BY 是在 TOP 子句之后应用您需要使用表单的子查询

select top n ...
from (
  select ...
  from table
  where ...
  order by ...
)

让它工作。

于 2012-10-30T12:00:24.667 回答
0

是的,Access 在这方面不符合 ANSI-92,而 SQL-Server 是,并且可以使 SQL-Server 模仿 Access 的不符合行为作为一个选项。我在可以选择将 id 字段(即 PK)添加到 ORDER BY 并因此解决该问题的情况下发现了这一点。只要您的解决方案导致多字段 ORDER BY 中的至少一个字段的值在连续记录中不同,您的解决方法将遵循 TOP 参数。如果您的密钥在至少一个字段上没有中断,那么您可以认为 SELECT TOP 以这种令人惊讶的业余方式强制执行:

“返回前 n 条记录并查看第 n 条记录的 ORDER BY 字段的值,并包括具有该(那些)值的所有其他记录”。

于 2013-03-21T21:41:23.190 回答