SQL获取表中的最后一行而没有主ID

tdj*_*jdj 5 sql sql-server select row

我有一个包含800,000个没有主键的表。我不允许添加主键,我无法按TOP 1 .... ORDER BY DESC进行排序,因为完成此任务需要几个小时。因此,我尝试了以下方法:

DECLARE @ROWCOUNT int, @OFFSET int
SELECT @ROWCOUNT = (SELECT COUNT(field) FROM TABLE)
SET @OFFSET = @ROWCOUNT-1


select TOP 1  FROM TABLE WHERE=?????NO PRIMARY KEY??? BETWEEN @Offset AND @ROWCOUNT
Run Code Online (Sandbox Code Playgroud)

当然这是行不通的。

无论如何要使用此代码或更好的代码来检索表中的最后一行?

小智 11

如果你的表没有主键或者你的主键不整齐...你可以试试下面的代码...如果你想看到更多的最后一条记录,你可以改变代码中的数字

Select top (select COUNT(*) from table) * From table
EXCEPT
Select top ((select COUNT(*) from table)-(1)) * From table
Run Code Online (Sandbox Code Playgroud)


Ale*_*Aza 2

我假设当您说“最后一行”时,您的意思是“最后创建的行”。

即使您有主键,它仍然不是使用它来确定行创建顺序的最佳选择。无法保证主键值较大的行是在主键值较小的行之后创建的。
即使主键位于标识列上,您仍然可以使用 来覆盖插入时的标识值 set identity_insert on

最好有时间戳列,例如具有默认约束的 CreatedDateTime。您将在该字段上建立索引。
那么你的查询就会简单、高效且正确:

select top 1 *
from MyTable
order by CreatedDateTime desc
Run Code Online (Sandbox Code Playgroud)

如果没有时间戳列,则无法确定“最后一行”。