查询(select)
当select查询中指定了top以后,order by子句就起到双重作用。既要为top选项决定各行的逻辑优先顺序,同时还要对输出的行进行排序以展示数据。
(在定义表表达式的查询语句中不允许出现order by子句,因为关系表的行之间没有顺序。
只有在指定top的情况下,在视图中才可以使用order by子句。
这里也只是确保为top提供逻辑筛选服务,不能保证顺序。
<参考文章表表达式>)
如:select top(1)percent orderid,orderdate,custid,empid
from sales.orders
order by orderdate desc;
在这个查询中,多个行可能具有相同的订单日期,行的优先级关系没有定义。这一事实让查询具有一定的不确定性,多个查询结果都可以认为是正确的。
如果要想查询时确定性的,就要让order by列表能唯一的确定一行。
要在order by列表中增加一个附加属性。
select top(1)percent orderid,orderdate,custid,empid
from sales.orders
order by orderdate desc,orderid desc;
更新(update,delete,insert)
与select语句不同就,不能为修改语句的top选项指定逻辑上的order by子句。
(在数据更新的时候,不能直接让top和order by一起使用。可以使用表表达式)
如:delete top(10) from table order by id;
会提示:关键字 'order’附近有语法错误。
为了解决这个问题,可以使用表表达式来修改数据。
可以在带有top选项的select查询的基础上定义一个表表达式,这样就能用一个逻辑上的order by子句来定义各行之间的优先关系。
如:
with c as
(select top (50)*
from orders
order by orderid
)
delete from c;