Ответ 1
Использование единства - единственное, что я могу придумать, чтобы выполнить этот
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
Я использую SQL Server 2005, и я пытаюсь добиться чего-то вроде этого: Я хочу получить первые строки x и последние x строк в одном и том же предложении select.
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
Проверьте ссылку
SQL SERVER - Как получить TOP и BOTTOM Rows вместе с использованием T-SQL
Вы пытались использовать роутинг?
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 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 top 5 ... order by {specify columns asc}
union
select top 5 ... order by {specify columns desc}
Нет реальной разницы между этим и объединением, о котором я знаю, но технически это единственный запрос.
select t.*
from table t
where t.id in (select top 5 t2.id from table t2 order by MyColumn)
or
t.id in (select top 5 t2.id from table t2 order by MyColumn desc);
Затем вы не выполняете выбор снова. Это единственный вариант, если вы не хотите вытащить полный результирующий набор и затем отбросить все между ними.
ЛЮБОЙ sql я cna думает, что это то же самое - для нижней части вам нужно сначала знать, сколько у вас предметов (материализуйте все или используйте count (*)) или обратный порядок сортировки.
Извините, если это вас не устраивает, но в конце... реальности все равно, и я не вижу другого способа сделать это.
Я думаю, вы должны сделать это, используя только подзапрос
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)
)
отредактированы
select * from table where id in (
(SELECT TOP 5 id ORDER BY columnName) OR
(SELECT TOP 5 id ORDER BY columnName DESC)
)
Мне пришлось сделать это недавно для очень большой хранимой процедуры; если ваш запрос достаточно велик, и вы хотите свести к минимуму количество запросов, которые вы могли бы объявить @tempTable, вставьте в этот @tempTable запрос из этого @tempTable,
DECLARE @tempTable TABLE ( columns.. )
INSERT INTO @tempTable
VALUES ( SELECT.. your query here ..)
SELECT TOP(5) columns FROM @tempTable ORDER BY column ASC -- returns first to last
SELECT TOP(5) columns FROM @tempTable ORDER BY column DESC -- returns last to first