我尝试使用此查询获取表格的最后一行和下一行:
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;
我再次检查了一下,突然上面显示的查询有效。 谢谢你的帮助。
答案 0 :(得分:4)
Access使用JET引擎。它是seems ORDER BY应用 AFTER TOP子句,你需要使用表格的子查询
select top n ...
from (
select ...
from table
where ...
order by ...
)
让它发挥作用。
答案 1 :(得分:0)
是,Access在此区域不符合ANSI-92,而SQL-Server是,并且可以使SQL-Server模仿Access的不兼容行为作为选项。我发现这种情况,我可以选择将id字段(即PK)添加到ORDER BY,从而解决问题。只要您的解决方案导致多字段ORDER BY中的至少一个字段值在连续记录中不同,您的解决方案将遵循TOP参数。如果你的密钥没有在至少一个字段上中断,那么你可以想到以这种令人惊讶的业余方式强制执行SELECT TOP:
“返回TOP n记录并查看第n条记录的ORDER BY字段的值,并包括具有该(那些)值的所有其他记录”。