gpt4 book ai didi

sql-server - 为每一行获取随机数

转载 作者:行者123 更新时间:2023-12-03 21:22:00 25 4
gpt4 key购买 nike

我有一张表格,其中连续列出了一些名字。我想为每一行生成一个随机名称。我写了以下查询:

BEGIN transaction t1

Create table TestingName
(NameID int,
FirstName varchar(100),
LastName varchar(100)
)

INSERT INTO TestingName
SELECT 0,'SpongeBob','SquarePants'
UNION
SELECT 1, 'Bugs', 'Bunny'
UNION
SELECT 2, 'Homer', 'Simpson'
UNION
SELECT 3, 'Mickey', 'Mouse'
UNION
SELECT 4, 'Fred', 'Flintstone'

SELECT FirstName from TestingName
WHERE NameID = ABS(CHECKSUM(NEWID())) % 5

ROLLBACK Transaction t1

问题是此查询的“ABS(CHECKSUM(NEWID())) % 5”部分有时返回多于 1 行,有时返回 0 行。我一定是遗漏了什么,但我看不到。

如果我将查询更改为

DECLARE @n int
set @n= ABS(CHECKSUM(NEWID())) % 5

SELECT FirstName from TestingName
WHERE NameID = @n

然后一切正常,我每行得到一个随机数。

如果您采用上面的查询并将其粘贴到 SQL Management Studio 中并多次运行第一个查询,您将看到我试图描述的内容。

最终的更新查询看起来像

Update TableWithABunchOfNames
set [FName] = (SELECT FirstName from TestingName
WHERE NameID = ABS(CHECKSUM(NEWID())) % 5)

这是行不通的,因为有时我得到不止 1 行,有时我没有任何行。

我错过了什么?

最佳答案

问题是您为每一行获得了不同的随机值。这就是问题。此查询可能正在进行全表扫描。为每一行执行 where 子句 -- 并生成一个不同的随机数。

因此,您可能会得到一个随机数序列,其中没有一个 ID 匹配。或多个匹配的序列。平均而言,您将有一场比赛,但您不想要“平均”,您想要保证。

此时您需要 rand(),它每次查询只产生一个随机数:

SELECT FirstName
from TestingName
WHERE NameID = floor(rand() * 5);

这应该为您提供一个值。

关于sql-server - 为每一行获取随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30791686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com