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
我正在尝试从 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