Пейджинг и индивидуальный заказ результата - PullRequest
0 голосов
/ 23 февраля 2010

Я хочу запросить таблицу, чтобы она была упорядочена следующим образом:

1) «запись» 2) «запись №» 3) «вход-то» 4) "..входящий .."

Я сделал это через Union All и 4 разных запроса.

Но, кроме того, я хочу включить подкачку, чтобы я мог, например, получить номера строк 1-100, 101-200 и т. д. Я попытался Row_Num () Over (Order By), но не сделал этого, я думаю, потому что предложение Order By уничтожает мой собственный заказ.

Мой запрос выглядит примерно так (немного упрощенно)

SELECT Keyword FROM Keyword WHERE Keyword LIKE 'Keyword' Union All SELECT * FROM Keyword WHERE Keyword like '%Keyword%' AND NOT LIKE 'Keyword'

и весь запрос, который я опробовал:

WITH SearchResult as 
(SELECT * FROM Keyword WHERE Keyword like 'Keyword' Union All SELECT * FROM Keyword WHERE Keyword like '%Keyword%' AND NOT LIKE 'Keyword') 
SELECT * FROM 
(SELECT ROW_NUMBER() OVER (ORDER BY Keyword DESC) AS RowNum, * 
 FROM SearchResult) AS Results 
WHERE (RowNum BETWEEN (1 - 1) * 100 + 1 AND 1 * 100)

1 Ответ

0 голосов
/ 23 февраля 2010

Оберните ваши объединенные запросы в другой как производную таблицу, и вы можете использовать верхнее предложение.

SELECT TOP 100 * FROM (
   SELECT * FROM table where field = 'entry'
   UNION ALL
   SELECT * FROM table where field = 'entry#'
) sortedresults

Тогда вы были на правильном пути. Добавьте определенный столбец к каждому из ваших подмножеств отсортированных результатов, и затем вы сможете использовать его, чтобы сохранить порядок сортировки.

WITH SearchResult AS
  (SELECT *, ROW_NUMBER() OVER (ORDER BY QueryNum) as RowNum FROM
     (SELECT *, 1 as QueryNum FROM KeywordTable WHERE field = 'Keyword'
      UNION ALL
      SELECT *, 2 from KeywordTable WHERE field = 'Keyword#'
      ) SortedResults
  )
SELECT * from SearchResults WHERE RowNum BETWEEN 4 and 10

Важно, чтобы вы также сортировали каждый подзапрос по чему-то другому, кроме ключевого слова, чтобы их порядок оставался неизменным между запусками (и как вторичная сортировка в функции номера строки). Пример: скажем, у вас есть k1, k2, k3, k4, k5 - если вы выберете * где ключевое слово типа k%, вы можете получить k1, k2, k3, k4, k5 один раз и k5, k4, k3, k2, k1 следующий (SQL не гарантирует порядок возврата и может отличаться). Это скинет ваш пейджинг.

...