Вы должны «кешировать» результаты случайного ORDER BY.
В этом коде, если вы ссылаетесь на CTE в UNION, он будет оцениваться дважды, и у вас будет 2 разных порядка.CTE - это просто макрос
;WITH cList AS
(
SELECT team, ROW_NUMBER() OVER (ORDER BY NEWID()) AS rn
FROM teams
)
SELECT * INTO #tempresults FROM cList WHERE rn <= @rn --or however many
SELECT *, rn FROM #tempresults
UNION ALL
SELECT *, (2 * @rn) - rn FROM #tempresults
ORDER BY rn
Дублирование строк легко с помощью фиктивного перекрестного соединения (, как это ), но это требует упорядочивания и округления нумерации промежуточных результатов.Я не думаю, что это можно сделать одним оператором SQL