Как вы генерируете случайное значение из столбца другой таблицы в SQL?

#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 в качестве дальнейшего упрощения.