テーブルを昇順または降順に並べずに、SQL Serverのテーブルから最後の5つのレコードを選択したい。
これは私がこれまでに書いた中で最も奇妙なクエリとほぼ同じですが、順序付けをせずにテーブルから「最後の5」行を取得することは間違いありません。
select *
from issues
where issueid not in (
select top (
(select count(*) from issues) - 5
) issueid
from issues
)
これは、値を "top"句に渡すSQL Server 2005の機能を利用していることに注意してください-SQL Server 2000では機能しません。
Idにインデックスがあるとします。これは非常に高速です。
SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])
select * where 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
簡単には注文できません。
質問の言い回しは、希望する順序でデータを取得するために、テーブル内のデータを物理的に再分類しなければならないと考えるように聞こえます。その場合、これは当てはまりません。この目的のために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
これを使用できる最後のレコードから5つのレコードを検索し、
SELECT *
FROM Table Name
WHERE ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5
注文がなければ、これは不可能です。 「底」の定義は何ですか?以下は、データベースへの格納方法に応じて5行を選択します。
SELECT TOP 5 * FROM [TableName]
「最後の5行」は、実際にはクラスター化インデックスに応じて最後の5行です。定義により、クラスター化インデックスは、行の順序付け方法です。したがって、何らかの順序がなければ「最後の5行」を取得することはできません。ただし、クラスター化インデックスに関連する最後の5行を取得できます。
SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC
select * from table limit 5 offset (select count(*) from table) - 5;
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;
Mysqlで最後の5行を取得
このクエリは完全に機能しています
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
合計行数がわかっている場合は、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;
主キーまたは同一の列がない場合は、これを試してください:
select [Stu_Id],[Student_Name] ,[City] ,[Registered],
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from student
ORDER BY RowNum desc
メモリから取得できます。
最初にDataSetの行を取得し、次にDataSetの最後の5行を取得します。
一部のデータベースでは、データベースの順序で注文するための便利なトリックがあります。
SELECT * FROM TableName ORDER BY true
どうやら、これはここに投稿された他の提案のいずれかと連携して、結果を「データベースから出た順序」に残すことができます。データベースによっては、最後に変更された順序です。
テーブルの行数が5未満の場合、Matt Hamiltonとmsuvajacの答えは間違っています。なぜなら、TOP N行カウント値は負ではないかもしれないからです。
優れた例を見つけることができます ここ 。
select *
from table
order by empno(primary key) desc
fetch first 5 rows only
私はこのコードを使用しています:
select * from tweets where placeID = '$placeID' and id > (
(select count(*) from tweets where placeID = '$placeID')-2)
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
@ Apps Tawale のおかげで、 his answer に基づいて、ここにもう1つの(私の)バージョンがあります。
ID列のない最後の5つのレコードを選択するには、
select top 5 *,
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
それにもかかわらず、注文はありますが、RowNumでは:)
Note(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
Note(2):ID列がないと、大きなデータの場合、クエリに少し時間がかかります
SQL Serverでは、クエリで順序付けを使用しないと不可能だと思われます。これは私が使用したものです。
SELECT *
FROM
(
SELECT TOP 5 *
FROM [MyTable]
ORDER BY Id DESC /*Primary Key*/
) AS T
ORDER BY T.Id ASC; /*Primary Key*/