SQL 查询如何从另一个 table 获取随机记录到另一个 table 的查询中获取每一行?

SQL query on how do I get a random record from another table into a query on another table for every row?

我正在尝试从 table 生成一个随机值到针对另一个 table 编写的查询中。 数据库中有两个table(数据库名“TestDatabase”): a) [dbo].[Firstname_temp] - 包含名字列表(一列称为“名字”) b) [dbo].[Lastname_temp] - 包含姓氏列表(一列称为“姓氏”)

我使用 Lastname_temp table 作为基础,为查询中的每个姓氏引入随机名字。之所以选择姓氏 table,是因为与名字 table 相比,姓氏 table 的记录数 (80K) 多。

我已经编写了以下查询,但它现在按预期工作,因为它为每个姓氏带回了相同的随机名字。

SELECT Lastname,
(select top 1 Firstname from [dbo].[Firstname_temp] order by newid()) as Firstname
FROM [TestDatabase].[dbo].[Lastname_temp]

如何为每个姓氏行取回一个随机名字,而不是对所有姓氏都显示相同的名字?

在此先感谢您的帮助。

问题是 NEWID() 在整个查询中只执行一次。没有什么可以阻止 SQL 服务器这样做,因为子查询不相关。要解决此问题,您可以关联子查询。

说明:

NEWID() 是一个奇怪的函数。尽管它是一个 side-effecting 函数,但 SQL 服务器不保证它将 return 每个输出行一个新值,除非 NEWID() 调用是 直接在主SELECT中,或者它以某种方式与查询的外部相关。

在您的查询中,内部子查询不相关,因此编译器知道它可以将其从查询的其余部分中提升出来。为防止这种情况,您可以通过放入冗余相关性来强制它在每个外行上进行计算。例如:

SELECT
  Lastname,
  (
    select top (1)
      Firstname
    from [dbo].[Firstname_temp] f
    where l.Lastname = l.Lastname + ''
    order by newid()
  ) as Firstname
FROM [TestDatabase].[dbo].[Lastname_temp] l