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

与sql server中的“top”相反,如果不使用order by,则没有键/索引,sql,sql-server,Sql,Sql Server,我想从sql server表中检索最后10个结果。我希望它们是插入的最后10条记录,我如何才能做到这一点 我想从mytable中写入select bottom 10*,但这并不存在 我想插入最后10行。 没有时间戳 你不能 无法保证select*from mytable返回的最后10条记录将是最后10条插入的记录。没有使用默认顺序 您需要在反映插入顺序的相应列上输入ORDER BY。如果该表有自动递增id主键,则可以执行以下操作: select top 10 * from mytable or

我想从sql server表中检索最后10个结果。我希望它们是插入的最后10条记录,我如何才能做到这一点

我想从mytable中写入select bottom 10*,但这并不存在

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

你不能

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


您需要在反映插入顺序的相应列上输入ORDER BY。

如果该表有自动递增id主键,则可以执行以下操作:

select top 10 * 
from mytable
order by id desc

在MySQL中,可以使用select*from table LIMIT 0,10,也可以使用触发器

在审计表中为刚刚插入的行保存PKs,同时增加某种标识的索引可能就足够了。超过10行时删除最旧的

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

底部为 选择前4名* 来自tbl 按n描述订购 选择* 自下而上 按n订购

数据来源:

|N| |--| | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | |十,|

输出:

|N| |--| | 7 | | 8 | | 9 |
|10 |

我不认为top能做你认为它能做的事。此外,表上的主键/唯一id是什么?是SQLServer标识还是guid?@MarkBannister没有pkIt听起来您需要更改表的架构以添加一些内容来确定最后的插入顺序-如果您不需要支持合并复制,则标识关系可能就足够了;否则,在审计时也需要插入时间戳。@Nimchinpsky-请注意,您仍然无法绝对确定它们是最后插入的10条记录。祝你好运:@NimChimpsky-这就是这里的每个人都想告诉你的。无论您做了什么或没有做什么,SQL Server的代码仅在指定order BY时保证订单。它从不保证没有订单的订单。那么,为什么呢?因为这就是SQL Server的编写方式。这似乎是可能的,甚至可能你会得到正确的顺序,但它永远不会得到保证。对不起,这里没有默认订单,这是设计的。在未设置ORDERBY子句的情况下强制执行确定性顺序只会毫无理由地增加额外的开销。[好的,我刚才回复的评论被删除了…]当我从mytable中选择top 10*时,它确实会按插入顺序返回它们@如果没有连接、条件语句,并且最近没有人选择重写SQL查询引擎,则结果仅以插入顺序显示,即,这种行为是巧合,并且不能保证。。。而且该表还没有经过优化,没有移动到另一个磁盘,也没有从备份中重新加载。@NimChimpsky-目前可能会这样做,但这并不能保证,在一些数据更改之后也不会这样。假设您的表是一个堆,您可能会按照页面在文件中的位置进行分配顺序扫描。无法保证新页面将在现有页面之后分配,或者它将按顺序扫描这些页面。此外,可以将新行添加到替换以前删除的行中。如果需要,您需要添加一个适当的单调递增列。即使表上有一个自动递增id主键,您也不能确定查询将给出最后10个插入的。例如,可以在设置identity_insert为on的标识字段中指定值-1的插入