#sql #sql-server
#sql #sql-server
Вопрос:
До сих пор я смог получить этот запрос, который выдает эти результаты:
Но проблема, с которой я все еще сталкиваюсь, заключается в том, что эти результаты должны быть случайными для КАЖДОЙ СТРОКИ, а не постоянными для всех строк.
Итак, мой вопрос в том, как сделать все строки случайными, а не весь пакет с фиксированным случайным значением?
SELECT firstname
,lastname
,date_of_birth
,corp_name
,country_name
FROM person
CROSS JOIN corporation
WHERE corp_name IN (
SELECT TOP 1 corp_name
FROM corporation
ORDER BY newid()
)
Ответ №1:
Проблема заключается в чрезмерной оптимизации. Подзапрос вычисляется только один раз, даже если он имеет недетерминированную логику. Я рассматриваю это как ошибку, но я предполагаю, что у Microsoft есть некоторые запутанные доводы в пользу того, что это не ошибка.
В любом случае, я считаю, что предложение correlation обычно исправляет это:
select p.firstname, p.lastname, p.date_of_birth,
c.corp_name, c.country_name
from person p cross apply
(select top (1) c.*
from corporation c
where p.firstname <> c.corp_name -- or whatever
order by newid()
) c;
Обратите внимание, что это используется cross apply
в качестве дальнейшего упрощения.