如何在SQL中从另一个表的列生成随机值?

如何在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

到目前为止,我已经能够得到这个提供这些结果的查询:

但我仍然存在的问题是,这些结果对于每一行都是随机的,而不是所有行的值都是常量

所以我的问题是,如何使所有行随机,而不是使整批具有固定的随机值

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()
        )

问题是过度优化。子查询只计算一次,即使它具有非确定性逻辑。我认为这是一个bug,但我猜微软有一些复杂的理由认为这不是bug

在任何情况下,我发现关联子句通常可以解决这一问题:

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;
注意,这使用交叉应用作为进一步的简化