随机名称表中的 SQL 更新
Posted
技术标签:
【中文标题】随机名称表中的 SQL 更新【英文标题】:SQl Update from table of random Names 【发布时间】:2014-02-04 18:25:34 【问题描述】:我有一个随机名称表,只有 3 列(id
、firstname
、lastname
)。
我正在尝试让 SQL 使用从该表中随机选择的名称更新整个名称表。
这是我正在使用的 SQL。它似乎适用于某些记录,但并不总是对所有记录都有效,有时会留下 NULLS,或者并不总是更新所有行。有时它会影响 9 行,有时它会说影响 11 行......有什么想法吗?
update TestNames,rndnames
set TestNames.fname = rndnames.FirstName,TestNames.lname=rndnames.LastName
where rndnames.ID=floor(1+(rand()*600))
答案:
update
TestNames left join
(select ID,
floor(1+(rand()*600)) as rndid
from TestNames) as TN on TN.ID=TestNames.id
left join rndnames on TN.rndid=rndnames.id
set TestNames.fname=rndnames.FirstName,TestNames.lname=rndnames.LastName
【问题讨论】:
你有 1 到 600 条随机姓名记录吗?floor(1+(rand()*600))
生成的值范围是否与rndnames
中的实际行匹配?
是的,正好有600条记录,填的是从1到600的自增ID
【参考方案1】:
这里是查询:
update TestNames t cross join
rndnames r
set t.fname = r.FirstName,
t.lname = r.LastName
where r.ID = floor(1+(rand()*600));
仅当表达式选择的随机 id 与表中的 id 匹配时,它才会更新 testnames
中的一行。 rndnames
中的 id
值是否全部填充?
如果您的表不是很大并且它有一个id
,这是另一种方法:
update TestName t join
(select t.*,
(select id from rndnames order by rand() limit 1) as rndid
from testname t
) tr
on t.id = tr.id join
rndnames r
on t.rndid = r.id
set t.fname = r.FirstName,
t.lname = r.LastName;
编辑:
我认为这也可以:
update TestNames t cross join
rndnames r
set t.fname = r.FirstName,
t.lname = r.LastName
where r.ID = (select id
from rndnames
order by rand()
limit 1
);
【讨论】:
感谢您的回复,最终您输入的方式不起作用,但我接受了您的修复想法。您的第一个响应与我的问题完全相同,只是获得了一些记录,最后两个因不同原因出错,但我在我的帖子中发布的答案,我认为是您想要解决的问题,但是我没有从随机名称中选择 1 条随机记录,而是首先为每条记录分配一个随机数,然后加入它们。 @Schugs 。 . .我认为您修改后的查询比原始查询更有可能适用于所有行。这些查询的关键是从rndnames
表中提取一个有效的id
,而不是在看似不准确的值范围内生成一个。【参考方案2】:
update
TestNames left join
(select ID,
floor(1+(rand()*600)) as rndid
from TestNames) as TN on TN.ID=TestNames.id
left join rndnames on TN.rndid=rndnames.id
set TestNames.fname=rndnames.FirstName,TestNames.lname=rndnames.LastName
【讨论】:
以上是关于随机名称表中的 SQL 更新的主要内容,如果未能解决你的问题,请参考以下文章
如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表