首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

查询SQL语句,会考虑优化的最好

2013-11-29 
查询SQL语句,能考虑优化的最好表1:Orders 货单表id int 主键status char(1) 状态(0,1,2,3,4)表2:Users 用

查询SQL语句,能考虑优化的最好
表1:Orders 货单表
id int 主键
status char(1) 状态(0,1,2,3,4)

表2:Users 用户表
id int 主键
userName varchar(50) 用户名

表3:OrdersLog 日志表
id int 主键
orderId int 外键 对应Orders表主键
userId int 外键 对应Users表主键
status char(1) 同Orders表status
updateTime datetime

当Orders表中的状态发生改变时,会在OrdersLog中插入一条数据记录ordersId,userId 操作人,status 改变的状态,updatetime 更新时间.

我想查询出每一个货单最后更新的那条数据。一个货id对应一条数据
结果集包含的字段
orderId userName status updateTime
SQL查询
[解决办法]

select
  a.id as orderId,
  b.userName,
  c.status,
  c.updateTime
from 
  Orders as a,Users as b,OrdersLog as c
where 
  a.id=c.orderId  and b.id=c.userId
and 
  not exists(select 1 from OrdersLog where OrdersLog=c.OrdersLog and updateTime>c.updateTime)

[解决办法]
select orderId,userName, status, updateTime from 

(select *,rn=row_number() over (partition by orderid order by updatetime desc) from orderslog) a,users
where a.userid=b.userid and rn='1'
[解决办法]
try this, It 's better have an index on OrdersLog(orderId).

select a.orderId,b.userName,a.status,a.updateTime
 from OrdersLog a
 inner join Users b on a.userId=b.id
 inner join
 (select orderId,max(id) 'maxid'
  from OrdersLog
  group by orderId) c on a.orderId=c.orderId and a.id=c.maxid

[解决办法]
引用:
try this, It 's better have an index on OrdersLog(orderId).

select a.orderId,b.userName,a.status,a.updateTime
 from OrdersLog a
 inner join Users b on a.userId=b.id
 inner join
 (select orderId,max(id) 'maxid'
  from OrdersLog
  group by orderId) c on a.orderId=c.orderId and a.id=c.maxid

If he don't have index,what's the better?

热点排行