For at besvare dette spørgsmål, se på forespørgselsplanerne produceret af begge.
Den første SELECT er en simpel tabelscanning, hvilket betyder, at den producerer rækker i allokeringsrækkefølge. Da dette er en ny tabel, svarer den til den rækkefølge, du indsatte posterne.
Den anden SELECT tilføjer en GROUP BY, som SQL Server implementerer via en særskilt sortering, da det estimerede antal rækker er så lavt. Hvis du skulle have flere rækker eller tilføje et aggregat til din SELECT, kan denne operator ændre sig.
Prøv f.eks.:
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
På grund af antallet af rækker ændres dette til et hashaggregat, og nu er der ingen sortering i forespørgselsplanen.
Uden ORDER BY kan SQL Server returnere resultaterne i en hvilken som helst rækkefølge, og den rækkefølge, den kommer tilbage i, er en bivirkning af, hvordan den tror, den hurtigst kan returnere dataene.