视图中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.