Я использую SQL Server 2005, и я пытаюсь достигнуть чего-то вроде этого: Я хочу получить первые x строки и последние x строки в том же избранном операторе.
SELECT TOP(5) BOTTOM(5)
Конечно, BOTTOM
не существует, таким образом, мне нужно другое решение. Я полагаю, что существует легкое и изящное решение, которое я не получаю. Выполнение выбора снова с помощью GROUP BY DESC
не опция.
Использование объединения - единственное, что я могу придумать, чтобы выполнить это
select * from (select top(5) * from logins order by USERNAME ASC) a
union
select * from (select top(5) * from logins order by USERNAME DESC) b
Я думаю, у вас есть два основных варианта:
SELECT TOP 5 ...
FROM ...
ORDER BY ... ASC
UNION
SELECT TOP 5 ...
FROM ...
ORDER BY ... DESC
Или, если вы знаете, сколько элементов находится в таблице:
SELECT ...
FROM (
SELECT ..., ROW_NUMBER() OVER (ORDER BY ... ASC) AS intRow
FROM ...
) AS T
WHERE intRow BETWEEN 1 AND 5 OR intRow BETWEEN @Number - 5 AND @Number
Я думаю, вам нужно сделать это, используя только подзапрос
select * from table where id in (
(SELECT id ORDER BY columnName LIMIT 5) OR
(SELECT id ORDER BY columnName DESC LIMIT 5)
)
select * from table where id in (
(SELECT TOP(5) id ORDER BY columnName) OR
(SELECT TOP(5) id ORDER BY columnName DESC)
)
EDITED
select * from table where id in (
(SELECT TOP 5 id ORDER BY columnName) OR
(SELECT TOP 5 id ORDER BY columnName DESC)
)
Можно ли использовать объединение?
Например
select top 5 ... order by {specify columns asc}
union
select top 5 ... order by {specify columns desc}
Посмотрите ссылку
SQL SERVER - How to Retrieve TOP and BOTTOM Rows Together using T-SQL
Вы пытались использовать rownumber?
SELECT *
FROM
(SELECT *, ROW_NUMBER() OVER (Order BY columnName) as TopFive
,ROW_NUMBER() OVER (Order BY columnName Desc) as BottomFive
FROM Table
)
WHERE TopFive <=5 or BottomFive <=5
http://www.sqlservercurry.com/2009/02/select-top-n-and-bottom-n-rows-using.html
Тогда вы в пролете - повторное выполнение select является единственным вариантом, если только вы не хотите получить полный набор результатов и затем выбросить все, что между ними.
Любой sql, который я могу вспомнить, работает одинаково - для нижней части вам нужно знать, сколько у вас элементов (материализуйте все или используйте count(*)) или обратный порядок сортировки.
Извините, если это вам не подходит, но в конце концов.... реальности все равно, и я не вижу другого способа сделать это.