视图中ORDER BY子句的替代方案是什么?


12

这个问题只需要在此站点中即可:)

据我了解,ORDER BY被禁止在视图中使用,因为使用此视图时可能会进行多个排序。

我知道有很多方法可以绕过此限制,例如TOP 99.999999 PERCENT,但是我想知道什么是最佳实践,而不是如何破解它。

因此,如果我想在数据库中创建供个人使用的视图,这意味着我想连接到数据库并仅查看固定和排序的数据,如果无法订购视图,该怎么办?

当前在我的SQL Server数据库中,我有关于该TOPhack的视图,并且我经常使用它们,但是感觉不对。


1
为什么不TOP 100%?
加里克2011年

@garik-因为如果我正确理解gbn的链接,它仍然不能保证订购。这只是一个更简洁的错误答案
杰克说请尝试topanswers.xyz 2011年

1
@杰克·道格拉斯(Jack Douglas)这不是一个答案,它是关于99.999最高排名的评论...
garik 2011年

@garik-在SQL Server 2008中,前100%被忽略,仅使用99起作用。我认为它是固定的,但我的版本未更新。
Yellowblood 2011年

1
这不是技术限制。这是设计使然。这就是为什么任何解决方法都感觉像黑客一样的原因。在针对视图的查询中强加您的顺序。订单适用于结果集(例如,ge查询输出),而不适用于数据集合(例如,视图或表格)。
Nick Chammas

Answers:


2

因为所谓的视图应该是一组行,所以没有所谓的“有序”视图。如果需要固定顺序,请使用存储过程。


这是解释为什么不能在视图定义内强加排序的答案。根据定义,集合没有顺序。但是,当您TOP与结合使用ORDER BY时,您现在将定义一个新的集合,因为排序会影响哪些行位于“顶部”。这就是为什么TOP您可以ORDER BY在视图定义中使用它的原因。
Nick Chammas

9

只有最外面的ORDER BY才能保证订单

  • 任何中间或内部的ORDER BY都将被忽略。
    这包括视图中的ORDER BY
  • 任何表中都没有隐含顺序
  • 该表上的任何索引(是否聚集)都没有隐含顺序

链接

ORDER BY仅对查询的最外层SELECT语句保证排序结果。例如,考虑以下视图定义:(以及与该问题匹配的示例)


感谢您的澄清,但这不是我一直在寻找的答案:)我正在尝试查看视图中非常方便的ORDER BY的替代方案。
yellowblood 2011年

3

将ORDER BY添加到视图的输出中,即

  SELECT whatever FROM MYVIEW ORDER BY whatever

1
聚簇索引没有隐含的顺序。-1。
gbn

@SqlACID-良好的编辑,用+1代替-1 :)
杰克说尝试topanswers.xyz 2011年

这意味着您每次查询视图时都需要重写order by子句,这是我们在视图内部使用order by时要避免的事情。
yellowblood 2011年

正如dportas所说,查询周围的存储proc包装器可以工作,但可能不是您想要的。
SqlACID

我实际上尝试过存储过程,但是查询或操作起来并不容易且不够迅速。嗯
yellowblood 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.