Sql 按插入行的确切顺序返回行

Sql 按插入行的确切顺序返回行,sql,sql-server,Sql,Sql Server,我在SQLServer中有一个简单的连接表,其中有两个id列。 有没有办法按照插入的确切顺序选择所有行 如果我尝试使用SELECT*,即使我没有指定ORDERBY子句,也不会按插入的顺序返回行,而是按第一个键列排序 我知道这是一个奇怪的问题,但这个表非常大,我需要准确地检查奇怪行为何时开始,不幸的是,我的表中没有时间戳列 更新1 我将尝试解释为什么在没有ORDERBY子句的情况下从表中选择*时,行不会以“自然”顺序返回 我的桌子是这样的: id1 id2 ---------------

我在SQLServer中有一个简单的连接表,其中有两个id列。 有没有办法按照插入的确切顺序选择所有行

如果我尝试使用SELECT*,即使我没有指定ORDERBY子句,也不会按插入的顺序返回行,而是按第一个键列排序

我知道这是一个奇怪的问题,但这个表非常大,我需要准确地检查奇怪行为何时开始,不幸的是,我的表中没有时间戳列

更新1

我将尝试解释为什么在没有ORDERBY子句的情况下从表中选择*时,行不会以“自然”顺序返回

我的桌子是这样的:

id1     id2
---------------
  1       1
  2       2
  3       3
  4       4
  5       5
  5       6

... and so on, with about 90.000+ rows
id1     id2
---------------
1       1
1       35986
1       44775
1       60816
1       62998
1       67514
1       67517
1       67701
1       67837
...
1       75657 (100+ "strange" rows)

2       2
2       35986
2       44775
2       60816
2       62998
2       67514
2       67517
2       67701
2       67837
...
2       75657 (100+ "strange" rows)
现在,我不知道为什么可能是软件错误插入了这些行,但我的表有450万行,如下所示:

id1     id2
---------------
  1       1
  2       2
  3       3
  4       4
  5       5
  5       6

... and so on, with about 90.000+ rows
id1     id2
---------------
1       1
1       35986
1       44775
1       60816
1       62998
1       67514
1       67517
1       67701
1       67837
...
1       75657 (100+ "strange" rows)

2       2
2       35986
2       44775
2       60816
2       62998
2       67514
2       67517
2       67701
2       67837
...
2       75657 (100+ "strange" rows)
疯狂,我的桌子现在有数百万行了。我必须查看插入的行何时发生这种情况,因为我必须删除它们,但我不能仅使用*where id2 IN strange_ids*删除,因为存在属于这些id2列的正确id1列,我无法删除它们,因此我尝试查看插入这些行以删除它们的确切时间

当我从表中选择*时,它返回按id1排序的结果,如上表所示,然后
在我的表中没有按此顺序插入行。我认为我的表没有损坏,因为这是第二次这种奇怪的行为以同样的方式发生,但现在我有这么多行,我可以像第一次一样手动删除。为什么不按插入的顺序返回行?这些奇怪的行是昨天明确插入的,如果我在没有ORDER BY的情况下执行SELECT*操作,应该在我的表末尾返回,不是吗?

如果SELECT*没有按“自然”顺序返回它们,并且您没有插入带有时间戳或自动递增ID的行,那么我相信您已经失败了。如果您有一个标识字段,请按该字段排序。 但我的问题是,你怎么知道SELECT*没有按插入顺序返回它们

更新: 根据您的更新,似乎没有任何方法可以按照您的意愿返回记录,我猜您在ID1上有一个聚集索引

没有order by的select查询不会按任何特定顺序检索行。你必须有一个订单才能得到订单

SQL Server没有任何按插入顺序检索的默认方法。如果行中有信息,您可以这样做。最好的方法是使用主键标识列:

TableId int identity(1, 1) not null primary key
插入每一行时,该列将递增

您还可以拥有CreatedAt列:

但是,对于同时插入,这可能有重复项


但关键的一点是,不带ORDERBY子句的select返回一组无序的行。

正如其他人已经编写的那样,您将无法按照插入的顺序从链接表中取出行

Select *, %%physloc%% as pl from table
order by pl desc
如果此链接表正在连接的一个或两个表中的行存在某种内部排序,则可以使用该排序来尝试确定链接表行是何时创建的。基本上,在创建包含PK:s的两行之前,不能创建它们

但另一方面,你将无法知道它们被创建后多久

如果您有合适的备份,您可以尝试恢复一个或几个不同时间段的备份,然后尝试查看这些备份是否也包含这种奇怪的行为。它至少可以给你一些线索,让你知道这种陌生感是什么时候开始的


但底线是,只需使用一个select,就可以按照插入的顺序将行从表中取出。

ID列是否自动递增?不,它们只是两个外键。您必须尝试找到某种方法将数据链接到另一个具有时间戳的表,或者为了了解行为何时开始表现出来,仅仅一个代码块并不能提供一个好的答案。请添加解释。我们称之为确定性与非确定性
Select *, %%physloc%% as pl from table
order by pl desc