随机名称表中的 SQL 更新

Posted

技术标签:

【中文标题】随机名称表中的 SQL 更新【英文标题】:SQl Update from table of random Names 【发布时间】:2014-02-04 18:25:34 【问题描述】:

我有一个随机名称表,只有 3 列(idfirstnamelastname)。

我正在尝试让 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 更新的主要内容,如果未能解决你的问题,请参考以下文章

用另一个表中的随机条目更新表的列

SQL:连接中的限制和随机化结果

如何将一个表中的随机值添加到另一个 Oracle SQL

如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表

SQL select:一个表中的随机顺序值用于另一个表中的每一行

sql 一对多关系随机查一条