当前位置: 首页 > 面试题库 >

SQL在没有主ID的情况下获取表中的最后一行

汝楷
2023-03-14
问题内容

我有一个包含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

当然,这是行不通的。

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


问题答案:

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

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

最好使用timestamp列,例如具有默认约束的CreatedDateTime。您将在此字段上建立索引。
这样,您的查询将变得简单,高效且正确:

select top 1 *
from MyTable
order by CreatedDateTime desc

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



 类似资料:
  • 问题内容: 在SQL(SQL Server)中,是否可以从表的标识列中检索下一个ID(整数),而实际上无需插入行?如果删除了最近的行,则不一定是最高ID加1。 我之所以这样问,是因为我们有时不得不用新行更新活动数据库。该行的ID在我们的代码中使用(例如,Switch(ID){Case ID:},并且必须相同。如果我们的开发数据库和实时数据库不同步,最好预先预测一个行ID部署之前。 我当然可以 SE

  • 问题内容: 我需要将一堆列名称解析为列索引(以便使用一些不错的方法)。但是,我知道如何获取对象的唯一方法是调用some 。 我的问题是,获取ResultSet会占用我不必要的资源-我真的不需要查询表中的数据,我只需要一些有关表的信息。 有谁知道以任何方式获取对象而不先获取(可能来自巨大表)的对象吗? 问题答案: 也许你可以使用 它为每个表列返回一行。 在这种情况下,您将使用返回的本身,而不是其。

  • 我想查看项目中的所有类,当我找到一个从“City”派生的类时,我想创建一个该类型的新对象并将其添加到列表中。这允许我添加功能,而无需更新列表。最重要的是,我想在不使用任何库的情况下完成它。我已经找到了类似的主题,但他们使用了org。反思。我希望避免以下情况:

  • 问题内容: 在C#中,我们有和有或没有命名空间(包在Java世界中)得到一个类型(类在这种情况下)的名称。 java等于什么? 显然,有比手动使用和删除软件包名称更好的方法。 问题答案: 返回源代码中给定的基础类的简单名称。如果基础类是匿名的,则返回一个空字符串。 数组的简单名称是组件类型的简单名称,后接“ []”。特别是其组件类型为匿名的数组的简单名称为“ []”。 它实际上是从名称中删除软件包

  • 问题内容: 我看到了一些这样的代码: 我以为应该有一个? 为什么这段代码这样做呢? 问题答案: 如果您希望当前执行的方法仍引发异常,同时允许适当地清理资源,则这很有用。下面是处理调用方法中的异常的具体示例。

  • 除了使用环境变量之外,还有哪些方法可以从运行在该主机上的容器内部获取docker主机的主机名?我知道我可以在容器创建时将主机名作为环境变量传递给容器。我想知道如何在运行时查找它。 在docker主机中运行的容器是否有方法获得“foo.example.com”? 编辑以添加用例: 容器将为表单的服务发现创建一个SRV记录 其中20003是docker主机上动态分配的端口,用于侦听bar中某个固定端口