带有top选项的数据查询和更新

查询(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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值