Извините, что название дерьмо - я не мог придумать лучшего способа выразить это. Это моя структура данных:
Widget WidgetTransition
------ ----------------
Id, WidgetId,
... TransitionTypeId,
Cost,
...
Я хочу запрос, который даст мне список деталей для каждого виджета вместе с деталями перехода самый дорогой (max WidgetTransition.Cost). Если у виджета есть два или более переходов, которые «привязаны» для самого дорогого перехода, следует использовать детали самого последнего перехода (max WidgetTransition.WidgetId). Если виджет не имеет переходов, он не должен появляться в результатах. Это лучшее, что я мог придумать:
SELECT *
FROM Widget
JOIN WidgetTransition
ON WidgetTransition.WidgetId = Widget.Id
AND WidgetTransition.Cost = (
SELECT Max(MostExpensiveTransition.Cost)
FROM WidgetTransition MostExpensiveTransition
WHERE MostExpensiveTransition.WidgetId = Widget.Id
)
Это почти работает, но есть две проблемы.
- Не справляется с связанными переходами должным образом. Если виджет имеет два или более связанных переходов, каждый переход будет отображаться в результатах, а не в самых последних.
- В случае больших наборов данных запрос выполняется медленно. База данных Sybase, на которой я ее запускаю, выполнит два сканирования таблицы (WidgetTransition.Cost отсутствует в индексе) для WidgetTransition для каждого виджета. Предположительно один предназначен для объединения, а другой - для определения максимальной стоимости.
Есть ли лучший способ написать этот запрос, который решает связанную проблему и / или работает более эффективно? Я хочу избежать использования T-SQL или хранимой процедуры.