TOP AND APPLY
select top(n) from table order by fieldname
如果根据fieldname不能确定顺序,则会产生不稳定的输出.
若使用 with ties 查询结果集会包含额外的行,这些额外行在排列上的值与top最后一行排列的值相同.
apply 运算符有两种形式:cross apply and outer apply.类似 inner join and left outer join.
可以把外部查询的列作为参数传递给表值函数.
使用top and apply 组合解决常见的问题
1.每组中的top(n)
方案一:使用 row_number() over (partition by ) 子句 生成行号.
适用的场景是表不能太大.太大的话效率也会低,因为生成行号需要扫描一遍表或索引.
方案二:top(n)关联子查询
方案三:apply 与top(n)关联子查询
例子:
select e.empid,a.orderid,a.custid,a.orderdate,a.requireddate
from
hr.employees as e
cross join
(select top(3) orderid,custid,orderdate,requireddate from sales.orders as o
where o.empid=e.empid
order by orderdate desc,orderid desc) as a;
2匹配当前值的前一个值
方案一:使用 apply 也有较好的执行效率.
方案二:使用CTE 与row_number()相结合的方法.
节选自:inside sqlserver2008 技术内幕 tsql 查询