Я заинтересован в изучении некоторых (в идеале) независимых от базы данных способов выбора n- й строки из таблицы базы данных. Также было бы интересно увидеть, как этого можно достичь, используя встроенную функциональность следующих баз данных:
- SQL Server
- MySQL
- PostgreSQL
- SQLite
- оракул
В настоящее время я делаю что-то вроде следующего в SQL Server 2005, но мне было бы интересно увидеть другие более независимые подходы:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Кредит на приведенный выше SQL: блог Фироза Ансари
Обновление: см . Ответ Troels Arvin относительно стандарта SQL. Troels, есть ли у вас ссылки, которые мы можем цитировать?
OrderNo N
, введите столбец OrderSequenceNo в таблицу и сгенерируйте его из независимого генератора последовательностей при создании нового заказа.offset x fetch first y rows only
. В настоящее время поддерживается (как минимум) Postgres, Oracle12, DB2.Ответы:
Есть способы сделать это в дополнительных частях стандарта, но многие базы данных поддерживают свой собственный способ сделать это.
Действительно хороший сайт, который рассказывает об этом и других вещах, это http://troels.arvin.dk/db/rdbms/#select-limit .
В основном, PostgreSQL и MySQL поддерживают нестандартные:
Oracle, DB2 и MSSQL поддерживают стандартные оконные функции:
(который я только что скопировал с сайта, указанного выше, поскольку я никогда не использую эти БД)
Обновление: Начиная с PostgreSQL 8.4 поддерживаются стандартные оконные функции, так что ожидайте, что второй пример будет работать и для PostgreSQL.
Обновление: SQLite добавил поддержку оконных функций в версии 3.25.0 2018-09-15, поэтому обе формы также работают в SQLite.
источник
WHERE rownumber = n
чтобы получить только n-й ряд?PostgreSQL поддерживает оконные функции, как определено стандартом SQL, но они неудобны, поэтому большинство людей используют (нестандартные)
LIMIT
/OFFSET
:Этот пример выбирает 21-ую строку.
OFFSET 20
говорит Postgres пропустить первые 20 записей. Если вы не укажетеORDER BY
пункт, нет гарантии, какую запись вы вернете, что редко бывает полезно.источник
Я не уверен ни в одном из остальных, но я знаю, что SQLite и MySQL не имеют порядка строк по умолчанию. По крайней мере, на этих двух диалектах следующий фрагмент получает 15-ую запись из таблицы, сортируя по дате / времени ее добавления:
(конечно, вам нужно иметь добавленное поле DATETIME и установить в нем дату / время добавления записи ...)
источник
В SQL 2005 и выше эта функция встроена. Используйте функцию ROW_NUMBER (). Отлично подходит для веб-страниц со стилем просмотра «Предыдущая и Следующая»:
Синтаксис:
источник
Я подозреваю, что это крайне неэффективно, но это довольно простой подход, который работал на небольшом наборе данных, на котором я его пробовал.
Это позволит получить 5-й элемент, изменить второй верхний номер, чтобы получить другой n-й элемент
Только сервер SQL (я думаю), но должен работать на старых версиях, которые не поддерживают ROW_NUMBER ().
источник
1 небольшое изменение: n-1 вместо n.
источник
Проверьте это на SQL Server:
Это даст вам 10-ю строку таблицы emp!
источник
Вопреки тому, что утверждают некоторые из ответов, стандарт SQL не молчит по этому вопросу.
Начиная с SQL: 2003, вы можете использовать «оконные функции» для пропуска строк и ограничения результирующих наборов.
А в SQL: 2008 был добавлен немного более простой подход, использующий
OFFSET skip ROWS FETCH FIRST n ROWS ONLY
Лично я не думаю, что добавление SQL: 2008 действительно было необходимо, поэтому, если бы я был ISO, я бы не использовал его в уже достаточно большом стандарте.
источник
Когда мы работали в MSSQL 2000, мы делали то, что мы называли «трипл-флип»:
отредактированный
Это не было элегантно, и это не было быстро, но это работало.
источник
IF / ELSE IF
блоки подOuterPageSize
расчетом - на страницах 1 и 2 они сбросятOuterPageSize
значение обратно до 10. На странице 3 (строки 21-25) вычисление вернет 5, а на всех страницах 4 и более, отрицательный результат вычисления будет заменен на 0 (хотя, вероятно, было бы просто быстрее вернуть пустую строку данных сразу в этой точке).Выберите n-ю запись сверху
выберите n-ную запись снизу
источник
Oracle:
источник
where ROWNUM = x
будет работать только для х = 1 в БД Oracle. т.е.where ROWNUM = 2
не вернет никаких строк.В Oracle 12c Вы можете использовать
OFFSET..FETCH..ROWS
опцию сORDER BY
Например, чтобы получить третью запись сверху:
источник
Вот быстрое решение вашей путаницы.
Здесь Вы можете получить Последнюю строку, Заполнив N = 0, Второй последний - N = 1, Четвертый Последний, Заполнив N = 3 и так далее.
Это очень распространенный вопрос во время интервью, и это очень просто.
Далее Если вы хотите Amount, ID или какой-либо Числовой Порядок сортировки, вы можете перейти к функции CAST в MySQL.
Здесь, заполнив N = 4, вы сможете получить пятую последнюю запись наибольшей суммы из таблицы CART. Вы можете указать свое поле и имя таблицы и найти решение.
источник
ДОБАВИТЬ:
Это ограничит результаты одним результатом, начиная с результата n.
источник
Например, если вы хотите выбрать каждую десятую строку в MSSQL, вы можете использовать;
Просто возьмите мод и измените номер 10 здесь на любой номер, который вы хотите.
источник
Для SQL Server общий способ определения номера строки таков:
Например:
Это вернет информацию 20-го ряда. Обязательно укажите количество строк 0 после этого.
источник
LIMIT n, 1 не работает в MS SQL Server. Я думаю, что это единственная крупная база данных, которая не поддерживает этот синтаксис. Честно говоря, он не является частью стандарта SQL, хотя он настолько широко поддерживается, что так и должно быть. Во всем, кроме SQL-сервера LIMIT работает отлично. Для сервера SQL я не смог найти элегантного решения.
источник
Вот общая версия sproc, которую я недавно написал для Oracle, которая допускает динамическое разбиение на страницы / сортировку - HTH
источник
Но на самом деле, разве все это не просто уловки для хорошего проектирования баз данных? Несколько раз я нуждался в такой функциональности, как простой запрос для быстрого создания отчета. Для любой реальной работы использование подобных трюков создает проблемы. Если требуется выбрать конкретную строку, просто создайте столбец с последовательным значением и покончите с этим.
источник
Для SQL-сервера следующее вернет первую строку из заданной таблицы.
Вы можете перебрать значения с помощью чего-то вроде этого:
источник
В Sybase SQL Anywhere:
Не забывайте ORDER BY или это бессмысленно.
источник
T-SQL - выбор N-го номера записи из таблицы
Например, чтобы выбрать 5-ю запись из таблицы Employee, ваш запрос должен быть
источник
источник
Я написал этот запрос для поиска N-й строки. Пример с этим запросом будет
источник
невероятно, что вы можете найти движок SQL, выполняющий этот ...
источник
Ничего особенного, никаких специальных функций, если вы используете Caché, как я ...
Учитывая, что у вас есть столбец ID или столбец с датой, которому можно доверять.
источник
Вот как я это сделаю в DB2 SQL, я считаю, что RRN (относительный номер записи) хранится в таблице O / S;
источник
Сначала выберите первые 100 строк, упорядочив их по возрастанию, а затем выберите последнюю строку, упорядочив по убыванию и ограничиваясь 1. Однако это очень дорогой оператор, поскольку он обращается к данным дважды.
источник
Мне кажется, что для эффективности вам необходимо: 1) сгенерировать случайное число от 0 до единицы меньше, чем количество записей в базе данных, и 2) иметь возможность выбрать строку в этой позиции. К сожалению, разные базы данных имеют разные генераторы случайных чисел и разные способы выбора строки в позиции в наборе результатов - обычно вы указываете, сколько строк пропустить и сколько строк вы хотите, но это делается по-разному для разных баз данных. Вот то, что работает для меня в SQLite:
Это зависит от возможности использовать подзапрос в предложении limit (в SQLite это LIMIT <recs to skip>, <recs to take>). Выбор количества записей в таблице должен быть особенно эффективным, поскольку он является частью базы данных. метаданные, но это зависит от реализации базы данных. Кроме того, я не знаю, будет ли запрос фактически формировать набор результатов перед извлечением N-й записи, но я надеюсь, что в этом нет необходимости. Обратите внимание, что я не указываю предложение "order by". Возможно, было бы лучше «упорядочить» что-то вроде первичного ключа, который будет иметь индекс - получение N-й записи из индекса может быть быстрее, если база данных не может получить N-ую запись из самой базы данных без построения набора результатов. ,
источник
Наиболее подходящий ответ, который я видел в этой статье для сервера SQL
источник