Я могу выполнить SELECT TOP (200) ... но почему не BOTTOM (200)?
Ну, чтобы не вдаваться в философию, я имею в виду, как я могу сделать эквивалент TOP (200), но наоборот (снизу, как вы ожидаете, что BOTTOM сделает ...)?
SELECT
columns
FROM
(
SELECT TOP 200
columns
FROM
My_Table
ORDER BY
a_column DESC
) SQ
ORDER BY
a_column ASC
В этом нет необходимости. Вы можете использовать
ORDER BY
и просто изменить сортировку,DESC
чтобы получить тот же эффект.источник
Извините, но я не думаю, что вижу правильные ответы, на мой взгляд.
Функция
TOP
x показывает записи в неопределенном порядке. Из этого определения следует, чтоBOTTOM
функция не может быть определена.Независимо от какого-либо индекса или порядка сортировки. Когда вы делаете это,
ORDER BY y DESC
вы сначала получаете строки с наибольшим значением y. Если это автоматически сгенерированный идентификатор, он должен отображать записи, добавленные в таблицу последними, как это предлагается в других ответах. Тем не мение:TOP
функциейПравильный ответ должен заключаться в том, что нет и не может быть эквивалента
TOP
для получения нижних строк.источник
Логически,
Например, выберите «Нижние 1000» из списка «Сотрудник»:
В T-SQL
источник
Казалось бы, в любом из ответов, реализующих предложение ORDER BY в решении, отсутствует суть или на самом деле не понимается, что возвращает вам TOP.
TOP возвращает неупорядоченный набор результатов запроса, который ограничивает набор записей первыми N возвращенными записями. (С точки зрения Oracle, это похоже на добавление where ROWNUM <(N + 1).
Любое решение, использующее порядок, может возвращать строки, которые также возвращаются предложением TOP (поскольку этот набор данных был изначально неупорядочен), в зависимости от того, какие критерии использовались в порядке
Полезность TOP заключается в том, что как только набор данных достигает определенного размера N, он прекращает выборку строк. Вы можете почувствовать, как выглядят данные, без необходимости извлекать их все.
Для точной реализации BOTTOM потребуется извлечь весь набор данных в неупорядоченном виде, а затем ограничить набор данных последними N записями. Это не будет особенно эффективно, если вы имеете дело с огромными таблицами. Это также не обязательно даст вам то, о чем вы думаете . Конец набора данных не обязательно может быть «последними вставленными строками» (и, вероятно, не будет для большинства приложений с интенсивным использованием DML).
Точно так же решения, реализующие ORDER BY, к сожалению, потенциально губительны при работе с большими наборами данных. Если у меня есть, скажем, 10 миллиардов записей и мне нужны последние 10, было бы глупо заказывать 10 миллиардов записей и выбирать последние 10.
Проблема здесь в том, что BOTTOM не имеет того значения, о котором мы думаем, сравнивая его с TOP.
Когда записи вставляются, удаляются, вставляются, удаляются снова и снова, в хранилище появляются пробелы, а позже строки будут вставлены, если это возможно. Но то, что мы часто видим, когда выбираем TOP, оказывается отсортированными данными, потому что они могли быть вставлены на ранней стадии существования таблицы. Если в таблице не много удалений, может показаться, что она упорядочена. (например, даты создания могут быть такими же далекими, как и само создание таблицы). Но на самом деле, если это таблица с большим количеством удалений, строки TOP N могут выглядеть совсем не так.
Итак - суть здесь (каламбур) заключается в том, что кто-то, кто запрашивает BOTTOM N записей, на самом деле не знает, что они просят. Или, по крайней мере, то, что они просят, и то, что на самом деле означает BOTTOM, - не одно и то же.
Итак - решение может удовлетворить фактические бизнес-потребности отправителя запроса ... но не соответствует критериям НИЖНЕГО.
источник
insert
выполнил большой оператор, чтобы поместить строки в большую неиндексированную таблицу. (Я сначала заполняю таблицу, прежде чем начну ее индексировать.) Я потерял сеанс клиента из-за перезагрузки или чего-то еще, и теперь я хочу увидеть, есть ли там мои недавно добавленные строки. Если «нижняя» строка таблицы - одна из моих недавних, я знаю, что операция завершена. Если «нижняя» строка - это что-то еще, что ж, нет никаких гарантий, и я должен просканировать всю таблицу, чтобы убедиться ... но, скорее всего, я мог бы сэкономить время, быстро проверив «нижнюю», как вы можете верхняя'.В настоящее время принятый ответ Джастина Этье не является правильным ответом, как указывает «Защитник один».
Насколько я понимаю, на данный момент ни один другой ответ или комментарий не дает эквивалента BOTTOM (x), который задал автор вопроса.
Во-первых, давайте рассмотрим сценарий, в котором эта функция может понадобиться:
Это возвращает таблицу из одного столбца и пяти записей:
Как видите: у нас нет столбца ID; мы не можем заказать по возвращенному столбцу; и мы не можем выбрать две нижние записи, используя стандартный SQL, как мы можем сделать для двух верхних записей.
Вот моя попытка предложить решение:
А вот более полное решение:
Я ни в коем случае не утверждаю, что это хорошая идея для использования при любых обстоятельствах, но она дает желаемые результаты.
источник
Все, что вам нужно сделать, это перевернуть ваш
ORDER BY
. Добавить или удалитьDESC
к нему.источник
Проблема с другим способом упорядочивания состоит в том, что при этом часто не используются индексы. Он также не очень расширяемый, если вам когда-либо понадобится выбрать количество строк, которые не находятся в начале или в конце. Альтернативный способ заключается в следующем.
источник
Ответ "Tom H" выше правильный, и он работает для меня при получении нижних 5 строк.
Спасибо.
источник
попробуй это.
источник
Я придумал решение, которое не требует, чтобы вы знали количество возвращаемых строк.
Например, если вы хотите, чтобы в таблице были зарегистрированы все местоположения, кроме последнего 1 (или 2, или 5, или 34)
источник
Выполнение простого подзапроса, отсортированного по убыванию, с последующей сортировкой по тому же столбцу по возрастанию делает свое дело.
источник
Где ID - это первичный ключ таблицы TABLE1.
источник
Сначала создайте индекс в подзапросе в соответствии с исходным порядком таблицы, используя:
Затем упорядочите таблицу по убыванию по
RowIndex
столбцу, который вы создали в основном запросе:И, наконец, используйте
TOP
желаемое количество строк:источник