В оптимизации одного из подзапросов я дошел до такого состояния:
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
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Почему при выполнении транзакции с запросом с ошибкой коммит всё равно срабатывает для запросов, выполненных успешно? Например, при попытке...
Мне необходимо получить/обновить/удалить данные во внешней базе, никак не относящийся к базе самого приложенияНеобходимо к ней обращаться...