SQL:提高连接效率

时间:2011-07-19 21:08:34

标签: sql sql-server-2005

如果我转向此子查询选择销售人员及其出售的任何项目的最高价格:

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名加入但没有触及订单中的每条记录?

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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

工作?