【问题标题】:mysql update subquery setmysql更新子查询集
【发布时间】:2021-11-11 15:40:30
【问题描述】:

我找不到也无法使用 SQL Mysql 解决这个问题。 我想更新一个表的两列,而这些值的来源是另一个表,不得不随机来。 这是一个试探性的例子:

update table1 a1,
(select col1, col2 
 from table2  
 ORDER BY RAND() limit 1) a2
set a1.col1 = a2.col1, a1.col2 = a2.col2
where a1.col3 is not null;

从这个表格中,table2 中的相同值总是会出现。

table1         |  table2
id  col1 col2  |  id col1 col2
1   aaa  bbb   |  1  xxx  yyy
2   ccc  ddd   |  2  www  ttt 
               |  3  uuu  vvv

我希望表2中的值(col1,col2)在table1中随机定义(col1和col2)。

没有限制 1,它也使用相同的记录进行更新。好像table2中有1条记录。

也就是说,对于更新的每一行,在另一个表中进行一个子查询,随机带来一条记录。

【问题讨论】:

  • 当然,table2 中的相同值即将到来。由于LIMIT 1,子查询仅返回 1 行。
  • 请提供样本数据和期望的结果。 “必须随机来”不清楚。
  • @GordonLinoff 我很清楚他们想要什么。 table1 中 col3 为空的每一行都应该从 table2 的随机行中复制 col1 和 col2。但他们希望每个副本有不同的随机行。
  • 即他们想要两个表之间的某种随机连接。
  • @GordonLinoff 但我不知道该怎么做,我认为这需要你的 SQL 魔法。

标签: mysql sql random subquery


【解决方案1】:

您可以使用joinrow_number(),但可以多次使用:

update table1 t1 join
       (select *, row_number() over (order by rand()) as seqnum
        from table1 t1
       ) tt1
       on tt1.id = t1.id join
       (select *, row_number() over (order by rand()) as seqnum
        from table2 t2
       ) t2
       on t2.seqnum = t1.seqnum
    set t1.col1 = t2.col1,
        t1.col2 = t2.col2;

这会将一个随机定义的序列号添加到两个表中,并将其连接起来以进行匹配。额外的join是实现update

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多