【发布时间】:2013-06-27 14:21:20
【问题描述】:
我有一个简单的连接表,在 SQL Server 中有两个 id 列。 有没有办法按照插入的确切顺序选择所有行?
如果我尝试创建一个 SELECT *,即使我没有指定 ORDER BY 子句,这些行也不会按照它们插入的顺序返回,而是按第一个键列排序。
我知道这是一个奇怪的问题,但这张表很大,我需要准确检查奇怪行为何时开始,不幸的是我的表中没有时间戳列。
更新 #1
我将尝试解释为什么当我在没有 ORDER BY 子句的情况下 SELECT * FROM 表时,行没有按“自然”顺序返回。
我的桌子是这样的:
id1 id2
---------------
1 1
2 2
3 3
4 4
5 5
5 6
... and so on, with about 90.000+ rows
现在,我不知道为什么(可能是软件错误插入了这些行),但我的表有 450 万行,看起来像这样:
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)* 删除,因为有“正确”的 id1 列属于这些 id2 列,我不能删除它们,所以我想看看这些行是什么时候被插入来删除它们的。
当我 SELECT * FROM 表时,它返回我按 id1 排序,如上表,并且 这些行没有按此顺序插入我的表中。我认为我的表没有损坏,因为这种奇怪的行为第二次以同样的方式发生,但现在我有很多行可以像第一次一样手动删除。为什么行没有按照插入的顺序返回?这些“奇怪的行”是昨天明确插入的,如果我在没有 ORDER BY 的情况下执行 SELECT *,应该在我的表末尾附近返回,不是吗?
【问题讨论】:
-
您的 ID 列是否自动递增?
-
不,它们只是两个外键
-
您将不得不尝试找到某种方法将数据链接到另一个具有时间戳的表,或者为了了解行为何时开始表现出来。跨度>
标签: sql sql-server