Найдите номер строки в сортировке на основе идентификатора строки, затем найдите ее соседи.

Скажем, у меня есть некоторый оператор SELECT:

SELECT id, name FROM people
   ORDER BY name ASC;

У меня есть несколько миллионов строк в таблице peopleи предложение ORDER BYможет быть намного сложнее, чем то, что я показал здесь (возможно, работая с дюжиной столбцов).

Я получаю только небольшое подмножество строк (скажем, строки 1..11), чтобы отобразить их в пользовательском интерфейсе. Теперь я хотел бы решить следующие задачи:

  1. Найти номер строки с заданным id.
  2. Отображение 5 элементов до и 5 элементов после строки с заданным id.

Задачу 2 легко решить, как только я решу задачу 1, так как я могу использовать что-то подобное, если я знаю, что элемент, который я искал, имеет номер строки 1000в отсортированном наборе результатов ( это диалект SQL Firebird):

SELECT id, name FROM people
   ORDER BY name ASC
   ROWS 995 TO 1005;

Я также знаю, что могу найти рангстроки, подсчитав все строки, предшествующие той, которую я ищу, но это может привести к очень длинные предложения WHEREс тоннами ORи ANDв условии. И мне приходится делать это неоднократно. С моими тестовыми данными это занимает сотни миллисекунд, даже при использовании правильно проиндексированных столбцов, что слишком медленно.

Есть ли способ добиться этого с помощью некоторых функций SQL:2003 (например, row_number, поддерживаемых в Firebird 3.0)? Я никоим образом не являюсь гуру SQL, и здесь мне нужны некоторые указатели. Могу ли я создать кешированное представление, в котором результат будет включать индекс ранга/плотного ранга/строки?

5
задан Pierre Arnaud 22 May 2012 в 12:43
поделиться