2011-07-19 38 views
1

如果我把这个子查询,其选择支付任何项目销售人员和他们的最高价,他们卖:SQL:提高加盟效率

select *, 
    (select top 1 highestProductPrice 
    from orders o 
    where o.salespersonid = s.id 
    order by highestProductPrice desc) as highestProductPrice 
from salespersons s 
在这个

,以提高工作效率加盟

select *, highestProductPrice 
from salespersons s join (
     select salespersonid, highestProductPrice, row_number(
      partition by salespersonid 
      order by salespersonid, highestProductPrice) as rank 
     from orders) o on s.id = o.salespersonid 

它仍然触及每一个订单记录(它通过salespersonid似乎滤波前枚举整个表。)但是你不能做到这一点:

select *, highestProductPrice 
from salespersons s join (
     select salespersonid, highestProductPrice, row_number(
      partition by salespersonid 
      order by salespersonid, highestProductPrice) as rank 
     from orders 
     where orders.salepersonid = s.id) o on s.id = o.salespersonid 

连接中的where子句导致“多部分标识符”s.id“无法绑定。

有什么方法可以通过连接将每个订单组中的前1个连接起来,但没有触及订单中的每条记录?

+0

你是什么意思'触及每个记录'?它将不得不触及每一条记录**以找出哪一个需要成为顶级1 **。如果你没有按照你想要的顺序存在*索引,那么每次都必须在运行时执行(当然,它可能会缓存答案,或者构建一个可重用的临时索引)。 –

+0

当您将枚举筛选为仅可连接记录时,查询所花费的时间显着减少。换句话说,只对我想要排名的记录进行排名,而不排序基于salespersonid不会加入的记录 –

回答

2

尝试

SELECT 
    S.*, 
    T.HighestProductPrice 
FROM 
    SalesPersons S 

    CROSS APPLY 
    (
    SELECT TOP 1 O.HighestProductPrice 
    FROM Orders O 
    WHERE O.SalesPersonid = S.Id 
    ORDER BY O.SalesPersonid, O.HighestProductPrice DESC 
) T 
+0

这非常有趣,它将允许内部条件引用外部表。我会尝试一下。 –

+0

真的比使用排序的子选择更有效吗? –

1

select s.*, max(highestProductPrice) 
    from salespersons s 
    join orders o on o.salespersonid = s.id 
group by s.* 

select s.*, highestProductPrice 
    from salespersons s join (select salepersonid, 
          max(highestProductPrice) as highestProductPrice 
          from orders o) as o on o.salespersonid = s.id 

工作?

+0

我简化了选择。原始文件包含一对字段以查找集合中最低的字段。但是,我可以在Max()函数中汇总它们。我只是想知道,在S. *上选择截然不同会导致更大的延迟。 +1在正确的轨道上。 –