Получить минимальное / максимальное значение по ключу - разные подходы - PullRequest
2 голосов
/ 09 июля 2019

У меня есть таблица с двумя столбцами, а именно ID и KEY (пусть ключ здесь будет целым числом), например

ID KEY
ABC 6
DEF 1
GHI 12

ЗАДАЧА: Получить идентификатор ключа MAX

Решение 1:

Select Top(1) ID
from TABLE
order by KEY desc

Решение 2:

Select ID
from TABLE 
where ID = MAX(ID)

РЕДАКТИРОВАТЬ : запросбыл недействительнымВот что я имел в виду:

Select ID
from TABLE 
where KEY = (select max(KEY) from TABLE)

Одно из этих решений категорически лучше другого?Каковы преимущества / недостатки каждого решения.

РЕДАКТИРОВАТЬ : Предположим, что нет индекса.Случай 1 - большая таблица Случай 2 - маленькая таблица

Справочная информация: я делаю обзор кода, и я нашел оба решения несколько раз в разных контекстах - иногда с индексами, иногда без, иногда для больших таблиц, иногда для маленьких.

Ответы [ 5 ]

1 голос
/ 09 июля 2019

Два запроса различаются (после того, как вы исправили второй).

Первый обязательно возвращает одну строку.

Второй возвращает все соответствующих строк.

Первый возвращает строку, даже если key равен NULL.

Второй - нет.

Вы должны использовать логику, которая делает то, что вы хотите.

1 голос
/ 09 июля 2019

В решении 1 предложение order by просто отсортирует результат вашего запроса.Порядок выполнения запроса:

предложение FROM предложение ON предложение OUTER предложение WHERE предложение GROUP BY предложение HAVING предложение SELECT предложение DISTINCT предложение ORDER BY предложение TOP предложение

Вы можете использовать следующий запрос:

Select ID,
RANK() OVER (ORDER BY KEY DESC) AS KeyRank
from table1
HAVING keyRank = 1
1 голос
/ 09 июля 2019

Агрегат может не отображаться в предложении WHERE, если он не входит в подзапрос, содержащийся в предложении HAVING или в списке выбора.

Решение 1 будет наилучшим.Подзапрос в предложении where будет менее оптимальным.Есть действительно много методов проектирования, чтобы посмотреть на производительность, и я не собираюсь вдаваться в этот ответ.Вчера я нашел эту статью, которая дала мне больше перспективы https://www.red -gate.com / simple-talk / sql / database-management / sql-server-storage-internals-101 /

0 голосов
/ 09 июля 2019

Вы можете перейти с запросом 1,

Вы не можете использовать запрос 2, потому что вы не можете использовать агрегатную функцию, подобную этой, если вы хотите использовать выражение where и агрегатную функцию в вашем запросе, вы должны выполнить, как показано ниже:

Select id  from table where key in (select max(key) from test);

ссылка только с использованием агрегатной функции и с предложением

Select  ID ,max(key)
   from test
   group by ID,key
   having (key) >= 12
    order by 1
0 голосов
/ 09 июля 2019

Решение 1 будет работать, но Решение 2 выдаст исключение, как показано ниже

Сообщение 147, уровень 15, состояние 1, строка 22 Совокупность может не отображаться в Предложение WHERE, если оно не входит в подзапрос, содержащийся в предложении HAVING или список выбора, а агрегируемый столбец является внешним ссылка.

...