使用订单或任何其他方式对表进行排序或更新

时间:2013-06-07 23:57:01

标签: sql-server sql-server-2005

我想在MS SQL中对列进行排序。我有一个表格看起来像下面的表格,我的要求是对它进行排序,这可以通过“列名称”按顺序轻松完成,但如何以排序的方式永久保存它,我的意思是我不只是想要使用select语句查看已排序的数据实际上我想对此视图进行永久性更改。

Marks    Roll number    Name   
44         5            Mike
22         2            Robin
44         1            Jack
34         3            a
22         4            b

预期:

22      2          Robin
22      4          b
34      3          a
44      1          Jack
44      5          Mike

1 个答案:

答案 0 :(得分:4)

你不能。关系数据库没有对表中的行进行排序的概念。如果需要有序输出,则必须使用ORDER BY子句。这是一个基本事实,不是你可以解决的问题。

在SQL Server 2000中,在(本质上)错误中,Microsoft允许视图具有ORDER BY子句,该子句确实对输出进行了排序。但是,在SQL Server 2005中,这种情况发生了变化,因为以这种方式进行操作从来都不是正确的。

您可以尝试使用SELECT TOP (2147483647) * FROM dbo.Blah B ORDER BY B.Col;技巧,但这也不会在SQL Server的更高版本中删除它。 TOP的排序行为是副作用,而不是主效应,并且不应该依赖于视图。做得正确并将排序放在应该的位置:在表示层或提交给数据库的最终外部查询中(ala SELECT Columns FROM dbo.View ORDER BY X;)。

关于不对表中的行进行排序的更多信息:是的,存在聚簇索引,但由于以下几个原因,您无法依赖返回的数据:

  • 非聚集索引可用于满足查询,因此聚簇索引的排序对输出行集的排序没有影响。
  • 表格中可能根本没有聚集索引。
  • 虽然每个聚集索引页面的行都小于下一页并且大于上一页,但每页内的行本身并不是自定义的。
  • 并行性可以更改行的生成顺序,因为一个流可能比其他流更快或更慢地返回。
  • 在查询执行期间,如果另一个进程已经在读取将满足当前查询的某些行,则可以为当前查询无序地借用该数据以便保存读取(之后)当前查询将仅获取它缺少的剩余行。

有一种简单,可靠且必需方式来获取有序行集:ORDER BY