2

我有一个没有添加标识列的表。我真的不需要一个用于任何特定目的。

我有 821 行,我又做了 500 行的测试。现在我需要检查这 500 个文件,我正在寻找一种简单的方法来

select * from table where row_number > 821

我已经尝试过 row_number() 但我无法订购它们,我需要返回 821 以上的所有行。

4

2 回答 2

5

表是一个无序的行包。您无法识别插入的前 820 行,除非您有一些列来识别插入顺序(例如,受信任的 IDENTITY 或日期时间列)。否则,您将一堆弹珠扔在地板上,并要求第一个走进房间的人识别掉下落的前 820 颗弹珠。

这是一个非常简单的例子,它证明了输出顺序是无法预测的,当然也不能依赖于先进先出(并且还显示了 HABO 的“解决方案”中断的情况):

CREATE TABLE dbo.foo(id INT, x CHAR(1));

CREATE CLUSTERED INDEX x ON dbo.foo(x);

-- or CREATE INDEX x ON dbo.foo(x, id); -- doesn't require a clustered index to prove

INSERT dbo.foo VALUES(1,'z');
INSERT dbo.foo VALUES(2,'y');
INSERT dbo.foo VALUES(3,'x');
INSERT dbo.foo VALUES(4,'w');
INSERT dbo.foo VALUES(5,'v');
INSERT dbo.foo VALUES(6,'u');
INSERT dbo.foo VALUES(7,'t');
INSERT dbo.foo VALUES(8,'s');

SELECT TOP (5) id, x, ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
 FROM dbo.foo;

SELECT * FROM dbo.foo;

结果:

---- ---- ----
8    s    1
7    t    2
6    u    3
5    v    4
4    w    5

---- ----
8    s
7    t
6    u
5    v
4    w
3    x
2    y
1    z

SQLfiddle 演示

于 2013-10-04T17:12:59.363 回答
2

以下是一个可能有帮助的 hack,但不是一个普遍有用的解决方案:

Row_Number() over (order by (select NULL)) as UntrustworthyRowNumber
于 2013-10-04T16:46:00.527 回答