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:
USE [tempdb];
GO
CREATE TABLE [testOrder]
(
[id] int identity,
[name] nvarchar(100),
[created] datetime default current_timestamp
);
DECLARE @i int = 0;
WHILE @i < 100
BEGIN
INSERT INTO [testOrder] ([name]) VALUES (N'name ' + CAST(@i AS nvarchar(3)));
SET @i += 1;
END;
SELECT TOP 10 * FROM [testOrder]
ORDER BY [id]
--ORDER BY [created]
--DROP column id
ALTER TABLE [testOrder]
DROP COLUMN [id];
;WITH CTE AS (
SELECT
ROW_NUMBER() OVER(ORDER BY [created] DESC) AS [RN],
[name],
[created]
FROM
[testOrder]
)
SELECT
*
FROM
CTE
WHERE
[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...