2

ID 列が追加されていないテーブルがあります。特定の目的のためには本当に必要ありません。

821 行あり、さらに 500 行のテストを行いました。これらの 500 個のファイルをチェックする必要があり、簡単な方法を探していました。

select * from table where row_number > 821

row_number() を試しましたが、並べ替えることができません。821 を超えるすべての行を返す必要があります。

4

2 に答える 2

5

テーブルは、順序付けられていない行のバッグです。挿入の順序を識別するための列 (たとえば、信頼できる IDENTITY または datetime 列) がない限り、挿入された最初の 820 行を識別することはできません。そうしないと、床にビー玉を投げて、最初に部屋に入ってきた人に、最初に落ちた 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 デモ

于 2013-10-04T17:12:59.363 に答える