Мы хотим иметь возможность выбирать верхние N строк с помощью SQL Query. Целевой базой данных может быть Oracle или MySQL. Есть ли элегантный подход к этому? (Разумеется, мы имеем дело с отсортированными данными здесь.)Может ли быть SQL-агностический SQL-запрос для извлечения верхних N строк?
ответ
Чтобы получить 5 лучших бомбардиров из этой таблицы:
CREATE TABLE people
(id int,
name string,
score int)
попробовать этот SQL:
SELECT id,
name,
score
FROM people p
WHERE (SELECT COUNT(*)
FROM people p2
WHERE p2.score > p.score
) <=4
Я считаю, что это должно работать в большинстве мест.
№. Синтаксис отличается.
Вы можете, однако, создавать представления:
/* Oracle */
CREATE VIEW v_table
AS
SELECT *
FROM (
SELECT *
FROM table
ORDER BY
column
)
WHERE rownum <= n
/* MySQL */
CREATE VIEW v_table
AS
SELECT *
FROM table
ORDER BY
column
LIMIT n
Я не думаю, что это возможно, даже просто между MySQL и MSSQL. Я делаю выбор для моделирования такого поведения:
- создавать представления с автоматической инкрементной колонкой int; сказать «PagingHelperID»
- запросов записи, как:
SELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex
Это сделает заказ сложно, вам понадобятся различные представления для каждого заказа, в котором вы собираетесь извлечь данные.
Вы также можете «переписать» свой sql на лету при запросе в зависимости от базы данных и определить свой собственный метод для перезаписывающего устройства, но я не думаю, что есть «хороший» способ сделать это.
Справа. Я хочу избежать любого обнаружения базы данных. – pugmarx
Если есть уникальный ключ на столе да ...
Select * From Table O
Where (Select Count(*) From Table I
Where [UniqueKeyValue] < O.UniqueKeyValue) < N
Вы можете заменить свои собственные критерии, если вы хотите, определение «Вверх» должен основываться на какой-либо другой логике, чем на уникальном ключе ...
EDIT: Если «сортировка», определяющая значение «Верх», основана на уникальном столбце или наборе столбцов, то вы все равно можете использовать это, но вы не можете гарантировать вам смогут получить ровно N записей ...
Select * From Table O
Where (Select Count(*) From Table I
Where nonUniqueCol < O.nonUniqueCol) < 10
Если записи 8, 9, 10, 11 и 12 имеют одинаковое значение в [nonUniqueCol], тогда запрос будет генерировать только 7 записей (с «<») ... или 12 (если вы используете «< =»)
ПРИМЕЧАНИЕ: Поскольку это предполагает коррелированный подзапрос, производительность может быть проблемой для очень больших таблиц ...
Что делать, если ваши уникальные ключи являются GUID или некоторыми другими несекретными данными? –
Уникальный ключ позволяет вам идентифицировать записи ... если «сортировка», которая определяет значение «Верх», основана на какой-либо другой другой логике, тогда подзапрос будет записан для «подсчета» записей на основе этого логика ... Единственная проблема тогда в том, что если значение N происходит по определенному значению, где есть несколько экземпляров .... (если записи 8, 9, 10 и 11 имеют одинаковое значение, вы можете получить t Топ 10) –
Я думаю, что каждый продукт следует другой синтаксис для достижения этой цели. Пожалуйста, найдите аналогичный вопрос ниже. Is there an ANSI SQL alternative to the MYSQL LIMIT keyword?
Большая проблема, рассмотрев это, заключается в том, что MySQL не соответствует требованиям ISO SQL: 2003. Если бы это было, вы бы эти удобные функции управления окнами:
SELECT * from
( SELECT
RANK() OVER (ORDER BY <blah>) AS ranking,
<rest of columns here>,
FROM <table>
)
WHERE ranking <= <N>
Увы, MySQL (и другие, которые имитируют его поведение, например, SQLite), не, следовательно, весь предельный вопрос.
Проверьте этот фрагмент из Википедии (http://en.wikipedia.org/wiki/Window_function_(SQL)#Limiting_result_rows)
- 1. Получение минимальных верхних n строк
- 2. Может ли O (N * N) быть быстрее, чем O (N)
- 3. Ограничение верхних строк в
- 4. панды рассчитать rolling_std из верхних строк dataframe N
- 5. SQL: получить последовательную группу «N» строк (может быть между ними)
- 6. mySQL-запрос для верхних N записей сгруппированных записей
- 7. Pandas: top N строк, верхних N строк на группу, эквивалентных для ROW_NUMBER OVER (PARTITION BY ... ORDER BY ...)
- 8. Код для извлечения строк сбоев
- 9. Как быстро найти индекс столбца для верхних n значений матрицы?
- 10. Принимая элемент из массива строк, который может быть * может быть
- 11. Запрос сценария Powershell для csv, верхних записей n типа
- 12. Как извлечь серию из n строк после извлечения первой строки?
- 13. Как мало строк может быть включен javascript?
- 14. Использование perl для извлечения определенных выходных строк
- 15. Может ли дерево AVL быть построено со сложностью O (n)?
- 16. Возвращение большинства верхних n коммиттов в git
- 17. Получение верхних n ребер в графике networkx
- 18. Выбор 2 верхних строк отсортированных таблиц для каждого человек ID
- 19. n не может быть разрешено переменной
- 20. Можно ли использовать xgettext для извлечения определенных строк домена?
- 21. Regex для извлечения строк после последнего совпадения
- 22. Поиск ячеек и извлечения строк
- 23. Может ли Parallel.For быть потомок?
- 24. Совокупная сумма для n строк
- 25. Regex выражения для извлечения строк
- 26. Поиск верхних N столбцов для каждой строки в фрейме данных
- 27. Может ли% NOTFOUND вернуть null после извлечения?
- 28. Выражение: Итератор строк не может быть разыменован
- 29. Python zip() для n строк
- 30. Есть ли полуавтоматический способ выполнения извлечения строк для i18n?
Ограничение принуждения к заказу вашего вида (по крайней мере, на SQL-сервере при использовании предложения TOP n). – Tomalak
И другие СУБД поддерживают концепцию, но используют другие обозначения. –
Кроме того, некоторые СУБД не допускают предложение ORDER BY в представлении. –