内嵌视图与临时表
某些时候,查询需要将数据与其他一些可能只能通过执行 group by 然后执行标准查询才能收集的数据进行联接。例如,如果要查询最新五个定单的有关信息,您首先需要知道是哪些定单。这可以使用返回定单 id 的 sql 查询来检索。此数据就会存储在临时表(这是一个常用技术)中,然后与 products 表进行联接,以返回这些定单售出的产品数量:
create table #temp1 (orderid int not null, _
orderdate datetime not null)
insert into #temp1 (orderid, orderdate)
select top 5 o.orderid, o.orderdate
from orders o order by o.orderdate desc
select p.productname, sum(od.quantity) as productquantity
from #temp1 t
inner join [order details] od on t.orderid = od.orderid
inner join products p on od.productid = p.productid
group by p.productname
order by p.productname
drop table #temp1
这些 sql 语句会创建一个临时表,将数据插入该表中,将其他数据与该表进行联接,然后除去该临时表。这会导致此查询进行大量 i/o 操作,因此,可以重新编写查询,使用内嵌视图取代临时表。内嵌视图只是一个可以联接到 from 子句中的查询。所以,您不用在 tempdb 中的临时表上耗费大量 i/o 和磁盘访问,而可以使用内嵌视图得到同样的结果:
select p.productname,
sum(od.quantity) as productquantity
from (
select top 5 o.orderid, o.orderdate
from orders o
order by o.orderdate desc
) t
inner join [order details] od on t.orderid = od.orderid
inner join products p on od.productid = p.productid
group by
p.productname
order by
p.productname
此查询不仅比前面的查询效率更高,而且长度更短。临时表会消耗大量资源。如果只需要将数据联接到其他查询,则可以试试使用内嵌视图,以节省资源。