Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 具有Order By的子查询中TOP的奇怪行为_Sql Server - Fatal编程技术网

Sql server 具有Order By的子查询中TOP的奇怪行为

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

我正在使用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 (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中工作