SQL: повышение эффективности объединения - PullRequest
1 голос
/ 20 июля 2011

Если я включу этот подзапрос, который выбирает продавцов и их наибольшую цену, уплаченную за любой предмет, который они продают:

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 в соединении вызывает `multi-partидентификатор "s.id" не может быть привязан.

Можно ли каким-либо образом объединить первые 1 из каждой группы заказов с помощью объединения, но не затрагивая каждую запись в заказах?

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Попробуйте

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 голос
/ 20 июля 2011

будет

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

работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...