Om deze vraag te beantwoorden, kijk naar de queryplannen die door beide zijn gemaakt.
De eerste SELECT is een eenvoudige tabelscan, wat betekent dat het rijen in toewijzingsvolgorde produceert. Aangezien dit een nieuwe tabel is, komt deze overeen met de volgorde waarin u de records hebt ingevoegd.
De tweede SELECT voegt een GROUP BY toe, die SQL Server implementeert via een aparte sortering, aangezien het geschatte aantal rijen zo laag is. Als u meer rijen zou hebben of een aggregaat aan uw SELECT zou toevoegen, kan deze operator veranderen.
Probeer bijvoorbeeld:
CREATE TABLE #Values ( FieldValue varchar(50) )
;WITH FieldValues AS
(
SELECT '4' FieldValue UNION ALL
SELECT '3' FieldValue UNION ALL
SELECT '2' FieldValue UNION ALL
SELECT '1' FieldValue
)
INSERT INTO #Values ( FieldValue )
SELECT
A.FieldValue
FROM FieldValues A
CROSS JOIN FieldValues B
CROSS JOIN FieldValues C
CROSS JOIN FieldValues D
CROSS JOIN FieldValues E
CROSS JOIN FieldValues F
SELECT
FieldValue
FROM #Values
GROUP BY
FieldValue
DROP TABLE #Values
Vanwege het aantal rijen verandert dit in een hash-aggregaat en is er nu geen sortering in het queryplan.
Zonder ORDER BY kan SQL Server de resultaten in elke volgorde retourneren, en de volgorde waarin het terugkomt, is een neveneffect van hoe het denkt de gegevens het snelst te kunnen retourneren.