2012-10-30 45 views
1

我试图用这个查询得到我的表的最后和下一行:SQL语句返回错误的值(TOP N ... ORDER BY)

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 

\

​​

我检查一遍,突然上面所示的查询工作。 谢谢你的帮助。

+2

您正在使用哪些DBMS?在您的数据库管理系统中'order by'之前是否应用了'TOP n'子句?检查文档! –

+0

我使用Access 2007,但数据库最初是在Access 1997中编写的。 Order by子句应用于TOP子句之后,我相信。 – jAC

回答

4

访问使用JET引擎。它seems是ORDER BY应用 TOP子句,你将需要使用的形式

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

的子查询,以得到它的工作。

+0

非常感谢! – jAC

0

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

“返回TOP n记录并查看第n条记录的ORDER BY字段的值(s)并包括具有该(那些)价值的所有额外记录“。