Sql server 具有Order By的子查询中TOP的奇怪行为
我正在使用SQL Server 2014,试图获得第10条记录,并编写了以下查询Sql server 具有Order By的子查询中TOP的奇怪行为,sql-server,Sql Server,我正在使用SQL Server 2014,试图获得第10条记录,并编写了以下查询 SELECT TOP 1 * FROM (SELECT TOP 10 * from Books) AS B ORDER BY ID DESC; 但它会把最后一张唱片还给我。我发现它使用的是来自外部查询的ORDERBY ID DESC 再尝试几次,结果如下 查询1其工作正常 SELECT * FROM (SELECT TOP 10 * from Books) AS B SELECT * FROM (SELEC
SELECT TOP 1 *
FROM (SELECT TOP 10 * from Books) AS B
ORDER BY ID DESC;
但它会把最后一张唱片还给我。我发现它使用的是来自外部查询的ORDERBY ID DESC
再尝试几次,结果如下
查询1其工作正常
SELECT *
FROM (SELECT TOP 10 * from Books) AS B
SELECT *
FROM (SELECT TOP 10 * from Books ORDER BY ID ASC) AS B
ORDER BY ID DESC;
结果
查询2未按预期工作。它应该是ID为10-1的返回记录
SELECT *
FROM (SELECT TOP 10 * from Books) AS B
ORDER BY ID DESC;
结果
query3如果我在子查询中使用了orderby
,那么它会按预期工作
SELECT *
FROM (SELECT TOP 10 * from Books) AS B
SELECT *
FROM (SELECT TOP 10 * from Books ORDER BY ID ASC) AS B
ORDER BY ID DESC;
结果
谁能告诉我我做错了什么。为什么有必要在子查询中使用orderby
如果在查询1中从ID获取1-10之间的记录,那么为什么在查询2中返回最后10条记录?我刚刚添加了orderbydesc,它应该只对从子查询中获取的记录重新排序
还尝试了以下查询,其工作正常
SELECT TOP 1 * FROM (SELECT TOP 10 * from Customers) AS B ORDER BY CustomerId DESC;
子查询中没有排序 试试CTE-
WITH CteBooks as (
SELECT TOP 10 * FROM Books ORDER BY ID ASC
)
SELECT TOP 1 * FROM CteBooks ORDER BY ID DESC;
子查询中没有排序 试试CTE-
WITH CteBooks as (
SELECT TOP 10 * FROM Books ORDER BY ID ASC
)
SELECT TOP 1 * FROM CteBooks ORDER BY ID DESC;
那么
OFFSET
条款呢:
SELECT CustomerID
FROM Customers
ORDER BY CustomerID ASC
OFFSET 10 ROWS
FETCH NEXT 1 ROWS ONLY
在SQL Server 2012上工作,选择偏移量为10的元素,并仅获取一行 关于
OFFSET
条款:
SELECT CustomerID
FROM Customers
ORDER BY CustomerID ASC
OFFSET 10 ROWS
FETCH NEXT 1 ROWS ONLY
在SQL Server 2012上工作,选择偏移量为10的元素,并仅获取一行 如果我没有在CTE中使用
orderbyIDASC
,那么它的行为就和我在问题中提到的一样。您的查询是从一个子查询中获取底部1,该子查询不一定具有前10个ID。感谢您的努力。您能告诉我,在我的问题中,从query1
中,如果我从ID中获取的记录在1-10之间,那么为什么在query2
中它会返回最后10条记录?我刚刚添加了orderbydesc,它应该只对从子查询中获取的记录重新排序。表没有排序。除非指定顺序,否则结果将根据聚集索引、执行计划和服务器引擎的突发奇想进行排序。碰巧它在查询1中工作。如果我在CTE中不使用orderbyIDASC
,那么它的行为与我在问题中提到的一样。完全正确。您的查询是从一个子查询中获取底部1,该子查询不一定具有前10个ID。感谢您的努力。您能告诉我,在我的问题中,从query1
中,如果我从ID中获取的记录在1-10之间,那么为什么在query2
中它会返回最后10条记录?我刚刚添加了orderbydesc,它应该只对从子查询中获取的记录重新排序。表没有排序。除非指定顺序,否则结果将根据聚集索引、执行计划和服务器引擎的突发奇想进行排序。它碰巧在查询1中工作,非常幸运。感谢您的努力。你们能告诉我,从我问题中的查询1中,若我从ID中得到的记录在1-10之间,那个么为什么在查询2中它会返回最后10条记录?我刚刚添加了ORDER BY DESC,它应该只对从子查询中获取的记录重新排序。@Karan:如果我提醒正确,子查询没有排序,因此RDMS必须返回他选择的10个结果中的任何一个:我完全同意您提供的链接中的答案。但在查询1中,结果返回id为1-10的记录,那么外部查询必须仅对这10条记录进行排序,对吗?如果查询1(没有order子句,没有where子句)返回从1到10的id(如果您的第一个id以2开头会怎么样?),这只是一个巧合,它可以返回id为1,8,50,35的结果。。。。对于这个请求,您唯一可以确定的是,它最多必须返回10行,而不是返回结果的位置或方式choosen@OwlsSleeping如果您仔细阅读之前发布的链接,它碰巧在查询1中工作,非常幸运
感谢您的努力。你们能告诉我,从我问题中的查询1中,若我从ID中得到的记录在1-10之间,那个么为什么在查询2中它会返回最后10条记录?我刚刚添加了ORDER BY DESC,它应该只对从子查询中获取的记录重新排序。@Karan:如果我提醒正确,子查询没有排序,因此RDMS必须返回他选择的10个结果中的任何一个:我完全同意您提供的链接中的答案。但在查询1中,结果返回id为1-10的记录,那么外部查询必须仅对这10条记录进行排序,对吗?如果查询1(没有order子句,没有where子句)返回从1到10的id(如果您的第一个id以2开头会怎么样?),这只是一个巧合,它可以返回id为1,8,50,35的结果。。。。对于这个请求,您唯一可以确定的是,它最多必须返回10行,而不是返回结果的位置或方式choosen@OwlsSleeping如果您仔细阅读之前发布的链接,它碰巧在查询1中工作