Я хочу выбрать последние 5 записей из таблицы в SQL Server, не упорядочивая таблицу в порядке возрастания или убывания.





Без заказа это невозможно. Что определяет «дно»? Следующее выберет 5 строк в соответствии с тем, как они хранятся в базе данных.
SELECT TOP 5 * FROM [TableName]
Правильно, также вы можете добавить «порядок по colx desc» в нижнюю пятерку в зависимости от индексов. т.е. верхние 5 ЯВЛЯЮТСЯ нижние 5, если вы измените порядок.
Это не так. Этот запрос выберет 5 строк но не всегда) в соответствии с тем, как они хранятся в базе данных.
Вы можете извлечь их из памяти. Итак, сначала вы получаете строки в DataSet, а затем последние 5 строк из DataSet.
Это чуть ли не самый причудливый запрос, который я когда-либо писал, но я почти уверен, что он получает «последние 5» строк из таблицы без упорядочивания:
select *
from issues
where issueid not in (
select top (
(select count(*) from issues) - 5
) issueid
from issues
)
Обратите внимание, что при этом используется способность SQL Server 2005 передавать значение в предложение «top» - это не работает в SQL Server 2000.
Если под последним вы имеете в виду порядок кластеризованного ключа, то я боюсь, что не работает
Я протестировал это на таблице, не имеющей кластеризованного индекса, и он вернул последние пять строк, которые я получаю, выполняя простой «выбор * из проблем».
И просто попробовал это на таблице с первичным ключом "identity int", и там он тоже сработал. Достали мне "последние пять" рядов.
В ПОРЯДКЕ. Я тестировал таблицу с кластеризованным индексом.
без заказа это не работает. период. вы можете попасть в ситуацию, когда один запрос опирается на результаты другого запроса, и результаты могут быть совершенно разными.
Ну, «последние пять строк» на самом деле являются последними пятью строками в зависимости от вашего кластерного индекса. По определению, ваш кластерный индекс - это способ упорядочения строк. Так что вы действительно не можете получить «последние пять строк» без определенного порядка. Однако вы можете получить последние пять строк, поскольку они относятся к кластеризованному индексу.
SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC
Есть удобный трюк, который работает в некоторых базах данных для упорядочивания в порядке базы данных,
SELECT * FROM TableName ORDER BY true
По-видимому, это может работать в сочетании с любыми другими предложениями, размещенными здесь, чтобы оставить результаты в порядке их выхода из базы данных, который в некоторых базах данных является порядком их последнего изменения.
Формулировка вашего вопроса создает впечатление, будто вы думаете, что вам нужно физически преобразовать данные в таблице, чтобы вернуть их в том порядке, в котором вы хотите. Если это так, то это не так, для этой цели существует предложение ORDER BY. Физический порядок, в котором хранятся записи, остается неизменным при использовании ORDER BY. Перед возвратом записи сортируются в памяти (или во временном дисковом пространстве).
Обратите внимание, что порядок, в котором возвращаются записи, не гарантируется без использования предложения ORDER BY. Итак, хотя любое из предложенных здесь предложений может работать, нет причин полагать, что они продолжат работать, и вы не можете доказать, что они работают во всех случаях с вашей текущей базой данных. Это сделано намеренно - я предполагаю, что это должно дать движку базы данных свободу действий с записями, чтобы получить максимальную производительность в случае, если не указан явный порядок.
Предполагая, что вам нужны последние 5 записей, отсортированных по полю Name в возрастающем порядке, вы можете сделать что-то вроде этого, что должно работать как в SQL 2000, так и в 2005:
select Name
from (
select top 5 Name
from MyTable
order by Name desc
) a
order by Name asc
Этот ответ должен быть отмечен как правильный (и наиболее совместимый).
Данные в таблицах не всегда находятся в организованном формате ... идея заключается в том, что делать, если мы хотим узнать последнюю запись в такой базе данных
@snigdha Ответ, приведенный выше, пытается сказать вам, что понятие "последний" не существует в SQL без ORDER BY.
Если вы знаете, сколько всего будет строк, вы можете использовать функцию ROW_NUMBER (). Вот экзамен от MSDN (http://msdn.microsoft.com/en-us/library/ms186734.aspx)
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
Предположим, у вас есть индекс по id, это будет молниеносно:
SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])
Это безопасно, только если вы не удалили никаких записей. т.е. если ваш максимальный идентификатор = 100, но вы удалили запись 99, вы получите только 4 записи, а не 5.
select *
from table
order by empno(primary key) desc
fetch first 5 rows only
Как написано, выбирает все строки в порядке убывания, а не только первые 5.
@JYelton - Нет, это не так. Действителен только в SQL Server 2012 и игнорирует требование «без сортировки».
выберите * где index_column> 7
select * from users
where user_id >
( (select COUNT(*) from users) - 5)
вы можете заказать их ASC или DESC
Но при использовании этого кода
select TOP 5 from users order by user_id DESC
его будет нелегко заказать.
Получите счет в этой таблице
select count(*) from TABLE
select top count * from TABLE where 'primary key row' NOT IN (select top (count-5) 'primary key row' from TABLE)
select * from table limit 5 offset (select count(*) from table) - 5;
Последние 5 строк извлекаются в mysql
Этот запрос работает отлично
SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC
или же
select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc
В SQL Server 2012 вы можете сделать это:
Declare @Count1 int ;
Select @Count1 = Count(*)
FROM [Log] AS L
SELECT
*
FROM [Log] AS L
ORDER BY L.id
OFFSET @Count - 5 ROWS
FETCH NEXT 5 ROWS ONLY;
Когда количество строк в таблице меньше 5, ответы Мэтта Гамильтона и msuvajac неверны. Поскольку значение TOP N rowcount не может быть отрицательным. Отличный пример можно найти Здесь.
я использую этот код:
select * from tweets where placeID = '$placeID' and id > (
(select count(*) from tweets where placeID = '$placeID')-2)
Найдите 5 записей из последних записей, которые вы можете использовать,
SELECT *
FROM Table Name
WHERE ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5
DECLARE @MYVAR NVARCHAR(100)
DECLARE @step int
SET @step = 0;
DECLARE MYTESTCURSOR CURSOR
DYNAMIC
FOR
SELECT col FROM [dbo].[table]
OPEN MYTESTCURSOR
FETCH LAST FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;
WHILE @step < 10
BEGIN
FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;
SET @step = @step + 1;
END
CLOSE MYTESTCURSOR
DEALLOCATE MYTESTCURSOR
Попробуйте это, если у вас нет первичного ключа или идентичного столбца:
select [Stu_Id],[Student_Name] ,[City] ,[Registered],
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from student
ORDER BY RowNum desc
Спасибо, если у нас есть identity_column, это было бы несложно .. Но у меня был View .. Так что это то, что я искал ..!
добавлена версия слегка изменен
Благодаря @Apps Tawale, на основе его ответ, вот немного другой (моей) версии,
Чтобы выбрать последние 5 записей без столбца идентификаторов,
select top 5 *,
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
Тем не менее, в нем есть заказ по, но на RowNum :)
Примечание (1): приведенный выше запрос изменит порядок того, что мы получаем, когда запускаем основной запрос выбора.
Итак, чтобы поддерживать порядок, мы можем немного пойти примерно так:
select *, RowNum2 = row_number() OVER (ORDER BY (SELECT 0))
from (
select top 5 *, RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
) as t1
order by RowNum2 desc
Заметка 2): Без столбца идентификаторов запрос занимает немного времени в случае больших данных
В SQL Server это невозможно без упорядочивания в запросе. Это то, что я использовал.
SELECT *
FROM
(
SELECT TOP 5 *
FROM [MyTable]
ORDER BY Id DESC /*Primary Key*/
) AS T
ORDER BY T.Id ASC; /*Primary Key*/
Если вы не хотите располагать таблицу в порядке возрастания или убывания. Использовать это.
select * from table limit 5 offset (select count(*) from table) - 5;
@Ganesh - вы должны сформулировать свой вопрос как реальный вопрос, а не как утверждение «Мне нужна помощь».