【问题标题】:SQL statement returns wrong values (TOP n ... ORDER BY)SQL 语句返回错误值(TOP n ... ORDER BY)
【发布时间】:2013-10-16 15:27:48
【问题描述】:

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

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;

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

【问题讨论】:

  • 您使用的是哪个 DBMS? TOP n 子句是否在您的 DBMS 中的 order by 之前应用?检查文档!
  • 我使用 Access 2007,但数据库最初是用 Access 1997 编写的。我相信 Order by 子句应用在 TOP 子句之后。

标签: sql ms-access jet


【解决方案1】:

Access 使用 JET 引擎。 seems ORDER BY 应用于 AFTER TOP 子句,您将需要使用表单的子查询

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

让它工作。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2021-12-23
      • 2016-08-27
      相关资源
      最近更新 更多