TOP在子查询中的奇怪行为

时间:2018-10-23 08:24:50

标签: sql-server

我正在使用SQL Server 2014并试图获取第10条记录并编写以下查询。

SELECT TOP 1 * 
FROM (SELECT TOP 10 * from Books) AS B 
ORDER BY ID DESC;

但是它返回了我最后的记录。我发现它正在使用来自外部查询的ID DESC顺序。

再尝试几次,其结果如下。

查询1 。其工作正常。

SELECT *
FROM (SELECT TOP 10 * from Books) AS B

结果 enter image description here

查询2 ,它无法正常工作。它应该是ID为10-1的返回记录。

SELECT *
FROM (SELECT TOP 10 * from Books) AS B
ORDER BY ID DESC;

结果 enter image description here

查询3 。如果我在子查询中使用ORDER BY,则它可以正常工作。

SELECT *
FROM (SELECT TOP 10 * from Books ORDER BY ID ASC) AS B
ORDER BY ID DESC;

结果 enter image description here

谁能告诉我我在做什么错。为什么必须在子查询中使用ORDER BY

如果在查询1 中从1到10之间的ID中获取记录,那么为什么在查询2 中返回最后10条记录呢?我刚刚添加了ORDER BY DESC,它应该仅对子查询中提取的记录重新排序。?

也尝试对W3School Try it yourself link here进行以下查询并使其正常工作。

SELECT TOP 1 * FROM (SELECT TOP 10 * from Customers) AS B ORDER BY CustomerId DESC;

2 个答案:

答案 0 :(得分:4)

子查询中没有排序。

尝试CTE-

try(PrintWriter out = ...)

答案 1 :(得分:2)

关于OFFSET子句:

SELECT  CustomerID
FROM     Customers
ORDER BY CustomerID ASC 
OFFSET  10 ROWS 
FETCH NEXT 1 ROWS ONLY

在SQL Server 2012上运行,选择偏移量为10的元素,并且仅占一行。