与sql server中的“top”相反,如果不使用order by,则没有键/索引

问题描述 投票:0回答:6

我想从 SQL Server 表中检索最后 10 个结果。我希望它们是最后插入的 10 条记录,我该怎么做?

我想写

select bottom 10 * from mytable
但是这不存在(据我所知)。

我想要插入最后 10 行。 没有时间戳。

sql sql-server
6个回答
17
投票

你不能。

根本无法保证

select * from mytable
返回的最后 10 条记录将是最后插入的 10 条记录。没有使用默认顺序。

您需要在相应的列上添加

ORDER BY
来反映插入顺序。


5
投票

如果该表有一个自增id(主键),那么你可以这样做:

select top 10 * 
from mytable
order by id desc

1
投票

https://stackoverflow.com/a/10636585/2858777

底部为(
选择前 4 个 * 来自表 按 n 描述排序 ) 选择 * 从底部 按 n

排序

数据来源:

| 尼 | |----| | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 |

输出:

| 尼 | |----| | 7 | | 8 | | 9 | | 10 |


0
投票

您可以使用触发器来完成此操作。

将刚刚插入的行的 PK 以及某种递增索引保存在审计表中(身份可能就足够了)。当超过 10 行时删除最旧的。

然后将审计表连接到原始表以获得完整的10行。


0
投票

首先,总的来说,其他答案都是正确的。 无法保证保留行的插入顺序。 如果重要的话,您通常应该使用诸如身份列之类的东西。

但是,如果您知道自己在做什么,并且无论出于何种原因,您在插入时都无法存储任何额外信息(可能是因为数据很大),并且如果错误排序的后果不是太严重(无论如何,也许稍后会被捕获),您可能依赖于磁盘上行的物理顺序。 您已经看到,

select top 10 * from mytable
通常会给出插入的前十行。 T-SQL 中没有
bottom
,要模拟它,您需要显式排序。 您可以使用
%%physloc%%
伪列来获取磁盘排序。

create table #x (x int not null)
insert into #x values (1),(2),(3),(4),(5)
select top 3 * from #x
  1
  2
  3
select top 3 * from #x order by %%physloc%%
  1
  2
  3
select top 3 * from #x order by %%physloc%% desc
  5
  4
  3

同样,这不是我通常在生产代码中信任的东西。 但谁知道呢,也许如果您正在处理一个刚刚批量加载的巨大表,并且您想查看上传的最后几行,那么它可能有它的用处。


-1
投票

在 MySQL 中你可以使用

select * from table LIMIT 0,10

© www.soinside.com 2019 - 2024. All rights reserved.