В оптимизации одного из подзапросов я дошел до такого состояния:
SELECT foo.id
FROM foo
INNER JOIN bar AS f ON foo.id = bar.foo_id
GROUP BY foo.id
HAVING MAX(foo.baz) != MAX(bar.baz)
Важно здесь следующее:
Не нравится хак с агрегатной функцией в HAVING — если применительно к полю bar.baz оно имеет смысл (выбираем только те записи, для которых поле foo.baz не равно максимальному bar.baz), то в случае с полем foo.baz оно используется исключительно для того, чтобы убрать поле из блока SELECT. Плюс, есть риск того, что max(*) возвращает не ожидаемый результат.
Как улучшить запрос?
Мне казалось что бизнесу главное что бы было правильно и быстро. Можно попробовать такой вариант с временной таблицей, должно быть быстрее.
select bar.foo_id, MAX(bar.baz) baz
into #bar
from bar
group by bar.foo_id
create index ix on #bar (foo_id, baz)
select foo.id
from foo
join #bar bar on foo.id = bar.foo_id AND foo.baz <> bar.baz
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Почему при выполнении транзакции с запросом с ошибкой коммит всё равно срабатывает для запросов, выполненных успешно? Например, при попытке...
Мне необходимо получить/обновить/удалить данные во внешней базе, никак не относящийся к базе самого приложенияНеобходимо к ней обращаться...