选择row_number或假身份

时间:2013-10-04 16:17:37

标签: sql sql-server tsql

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

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

从表中选择*,其中row_number> 821

我已经尝试过row_number()但是我不能让它们被命令,我需要返回821以上的所有行。

2 个答案:

答案 0 :(得分:5)

一张桌子是一排无序的行。您无法识别插入的前820行,除非您有一些列来标识插入顺序(例如,可信的IDENTITY或datetime列)。否则你在地板上扔了一堆弹珠,并要求第一个走进房间的人识别掉掉的前820弹珠。

这是一个非常简单的例子,它表明输出顺序无法预测,当然不能依赖于FIFO(并且还显示了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 demo

答案 1 :(得分:2)

以下是可能有用的黑客攻击,但 NOT 是一个通用的解决方案:

Row_Number() over (order by (select NULL)) as UntrustworthyRowNumber