Az utolsó 10 sor megjelenítése

Találtam véletlenül egy fórumot, ahol égbekiáltó hülyeséget fedeztem fel: a fórum itt érhető el. A lényeg: adott egy tábla és az utolsó 10 sorát kell visszaadni. ezzel még nem is lenne gond, de ORDER BY nélkül és nincs se timestamp se identity oszlop. Na akkor tisztázzunk valamit: az SQL Server nem garantálja az eredmény sorrendjét egészen addig, amíg az ORDER BY hiányzik a lekérdezésben!

Csak a vicc kedvéért pár megoldás:

 1USE [tempdb];
 2GO
 3 
 4CREATE TABLE [testOrder]
 5(
 6    [id] int identity,
 7    [name] nvarchar(100),
 8    [created] datetime default current_timestamp
 9);
10 
11DECLARE @i int = 0;
12WHILE @i < 100
13BEGIN
14    INSERT INTO [testOrder] ([name]) VALUES (N'name ' + CAST(@i AS nvarchar(3)));
15    SET @i += 1;
16END;
17 
18 
19 
20SELECT TOP 10 * FROM [testOrder]
21ORDER BY [id]
22--ORDER BY [created]
23 
24--DROP column id
25ALTER TABLE [testOrder]
26DROP COLUMN [id];
27 
28;WITH CTE AS (
29SELECT
30    ROW_NUMBER() OVER(ORDER BY [created] DESC) AS [RN],
31    [name],
32    [created]
33FROM
34    [testOrder]
35)
36 
37SELECT
38    *
39FROM
40    CTE
41WHERE
42    [RN] < 11

Az SQL Server 2012-ben vannak új window funkciók (FETCH, OFFSET), amelyek szintén elég jól használhatóak. de a lényeg továbbra is az, hogy NEM GARANTÁLT A SORREND AZ ORDER BY NÉLKÜL!!!! Aki nem hiszi, járjon utána, nekem volt már szerencsém látni olyat, hogy ORDER BY nélkül random jött vissza sor, pedig volt identity oszlop is clustered index-el! Mert ugye erről is terjed egy tévhit, de erről majd máskor...