Возврат основных строк на основе детального фильтра - PullRequest
2 голосов
/ 25 января 2010

У меня есть запрос, в котором я хочу вернуть мастер-строки в зависимости от того, соответствуют ли детали определенным критериям.

Например, я хочу вернуть конкретную мастер-строку только в том случае, если по крайней мере одна из строк детализации имеет SomeProperty = X.

На основе следующего предиката:

        predicate = predicate.And(p =>
                                  p.BasketItems.Where(obi => obi.BasketItemTypeID ==
                                                                  (int) BasketType.Refund).Count() > 0);

генерирует следующий SQL:

SELECT COUNT(*)
    FROM [dbo].[BasketItems] AS [t3]
    WHERE ([t3].[BasketId] = [t0].[OrderBasketID]) AND ([t3].[BasketItemTypeID] = 3)
    )) > 0)

Проблема в том, что он выполняет сканирование таблицы, поэтому выполнение запроса занимает некоторое время.

Просто проверяю, что я не делаю ничего сумасшедшего, и задаюсь вопросом, может ли что-нибудь ускорить этот запрос?

Спасибо Дункан

1 Ответ

1 голос
/ 23 июня 2011
select M.basketID, max(M.field1) as field1, max(M.field2) as field2 
from dbo.basketItems as M
Inner join detail on M.basketID = detail.basketID
where detail.basketItemTypeID = '3'
group by M.basketID

(Соединение мастера с деталями. Выберите все строки, где детали имеют требуемый критерий. Вырежьте результирующие строки до 1 на основную запись.)

...