У меня довольно много хранимых процедур, следующих шаблону выбора строки, для которой столбец даты является последним до определенной даты включительно. Я вижу две используемые формы:
select top 1 x, y, z from sometable where a=b and date <= @date order by date desc
or
select x, y, z from sometable where a=b and date=(select max(date) from sometable where a=b and date <= @date)
Я могу представить производную от второй формы, которая также использует соединение вместо подзапроса.
Мы можем игнорировать случай, когда вторая форма может возвращать несколько строк. Предположим, что никогда не будет.
Поскольку это используется во многих местах, некоторые из которых против большого количества строк в критически важном для производительности коде, я хочу стандартизировать то, что является более оптимальным решением (что может быть другим предложением).
Некоторое гугление обнаружило множество сравнений TOP 1 и MAX, но, как правило, для одного значения и без подзапроса. В этом случае MAX является явным победителем, но я не уверен, изменит ли это подзапрос.
Я был бы признателен за мнение тех, кто более осведомлен в этой области, чем я (которых должно быть большинство из вас!).