Chcete-li odpovědět na tuto otázku, podívejte se na plány dotazů vytvořené oběma.
První SELECT je jednoduché prohledávání tabulky, což znamená, že vytváří řádky v pořadí přidělení. Protože se jedná o novou tabulku, odpovídá pořadí, ve kterém jste vložili záznamy.
Druhý SELECT přidá GROUP BY, které SQL Server implementuje prostřednictvím odlišného řazení, protože odhadovaný počet řádků je tak nízký. Pokud byste měli mít více řádků nebo přidat agregaci do SELECT, tento operátor se může změnit.
Zkuste například:
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
Kvůli počtu řádků se to změní na agregaci hash a v plánu dotazů nyní není žádné řazení.
Bez ORDER BY může SQL Server vrátit výsledky v libovolném pořadí a pořadí, ve kterém se vrátí, je vedlejším efektem toho, jak si myslí, že může nejrychleji vrátit data.