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 SQL Server 2005从视图中选择前1名返回最后一行_Sql Server_Sql Server 2005_View_Top N - Fatal编程技术网

Sql server SQL Server 2005从视图中选择前1名返回最后一行

Sql server SQL Server 2005从视图中选择前1名返回最后一行,sql-server,sql-server-2005,view,top-n,Sql Server,Sql Server 2005,View,Top N,我的视图可能包含多行,如下所示: [rate] | [vendorID] 8374 1234 6523 4321 5234 9374 在存储过程中,我需要将param设置为视图第一行中第一列的值。大概是这样的: DECLARE @rate int; SET @rate = (select top 1 rate from vendor_view where vendorID = 123) SELECT @rate 但这总是返回视图的最后一行 事实上,如

我的视图可能包含多行,如下所示:

[rate] | [vendorID]
 8374       1234
 6523       4321
 5234       9374
在存储过程中,我需要将param设置为视图第一行中第一列的值。大概是这样的:

DECLARE @rate int;
SET @rate = (select top 1 rate from vendor_view where vendorID = 123)
SELECT @rate
但这总是返回视图的最后一行

事实上,如果我只是单独运行subselect,我只会得到最后一行。
视图中有3行,TOP 2按顺序返回第一行和第三行。有4行,它按顺序返回前3行。然而,排名前1的公司正在返回最后一家。 德普

这很有效

DECLARE @rate int;

CREATE TABLE #temp (vRate int)
INSERT INTO  #temp (vRate) (select rate from vendor_view where vendorID = 123)

SET @rate = (select top 1 vRate from #temp)
SELECT @rate

DROP TABLE #temp
。。但是有人能告诉我为什么第一个人的行为如此愚蠢,以及如何做我想做的事吗?正如在评论中所解释的那样,没有一个有意义的专栏可以让我通过它来完成订单。我可以强制将插入行的顺序设置为返回行的顺序吗

[编辑]我还注意到:
从([view definition select])中选择top 1 rate
也会一次又一次返回正确的值。[/EDIT]

这是出于设计

如果不指定查询的排序方式,则数据库可以按照方便的顺序自由返回记录。用作默认排序顺序的表没有自然顺序

实际的顺序取决于查询的计划方式,因此您甚至不能依赖同一个查询随时间提供一致的结果,因为数据库将收集有关数据的统计信息,并可能会根据这些信息更改查询的计划方式

要获得所需的记录,只需指定它们的排序方式,例如:

select top 1 rate
from vendor_view
where vendorID = 123
order by rate

我在一个已经运行多年的查询中遇到了这个问题。我们升级了SQL Server,突然间,无序的
select top 1
没有返回表中的最终记录。我们只是在
select
中添加了一个
orderby

我的理解是,如果未提供按排序,或者引擎选择了任何索引,SQL Server通常会根据聚集索引向您提供结果。但是,这并不能保证一定的秩序


如果您没有要订购的东西,您需要添加它。添加插入日期列并将其默认为
GETDATE()
或添加
identity
列。从历史上看,它对您没有帮助,但它解决了未来的问题。

虽然查询结果应该一致并不一定有意义,但在这个特定的实例中,它们是一致的,因此我们决定保持“原样”。最终,最好添加一个列,但这不是一个选项。此应用程序所属的应用程序将很快停止运行,数据库服务器将不会从SQL 2005升级。我不一定喜欢这样的结果,但事实就是这样:在它破裂之前,它不会被修复-x

您将什么定义为最后一行。你不是在命令你的结果。SQL Server不能保证每次执行查询时的顺序都是相同的,因此每次执行查询时,
TOP 1
可能是不同的一行。我想到了这一点,但除了我注意到的以外,它从未改变。当然,我假设插入到表中的最后一行将是最后一行,这可能不是事实?但是,如果所有这些都是真的,那么插入临时表也应该是不可靠的。我想可能是前1位影响了优化器,它在视图本身中基于表和联接进行一些时髦的排序?尽管如此,我还是希望temp table方法同样不可靠。综上所述,我无法对这些数据进行排序以欺骗插入顺序(无PK、无日期等)。如果您没有一个排序列来告诉您最近插入了哪些数据,您如何知道它过去没有返回错误的结果?不幸的是,我没有一个排序有意义的列。创建供应商或费率的顺序(也称为ID)与供应商和费率相互关联的顺序不同。不幸的是,视图正在抽象的关联表没有PKs,没有日期,等等——我所要做的就是数据插入的顺序。你是说似乎有效的临时表方法是一种侥幸吗?@JoeBrockhaus:是的,当你使用临时表时,你碰巧得到了预期的结果,这只是一种侥幸。如果您确实希望按记录添加的顺序获取记录,则必须在表中存储一些相关信息。一方面,这是一种侥幸,因为它不应该是一致的。另一方面,它是一致的,因此不太容易混淆-s@JoeBrockhaus:问题是它实际上并不一致。现在您得到了预期的结果,因为数据库以特定的方式从表中获取记录。当您向表中添加更多数据时,数据库可能会在某个时候决定以不同的方式获取数据,从而得到不同的结果。结果没有自然的顺序,因此不能保证数据库总是以相同的顺序返回它们。我理解它的缺陷和合理性,但我可以告诉你,它在8年多的时间里一直是一致的,表中添加了数十万行。很明显,这是违反直觉的,不应该是一致的,但事实确实如此。争论背后的理论毫无意义(我编造这个不是为了让你生气)。。这很奇怪,值得记录。或者更确切地说,它还没有损坏到可以修复的程度。:)一个重要的因素是,如果它会失败,确切的后果是已知的,这并不是说所有的乱七八糟。