mysql - SQL 语句 : how can I pick a value only once from a table to update another table?

标签 mysql sql sql-update

我希望用匹配相同代码的 table2 的任何不同值更新 table1,无论是哪一个或顺序(来自 table2 的值不能被选择多次)

+-------------------+      +--------------+
|      table1       |      |    table2    |
+-------------------+      +--------------+
| id | code | value |      | code | value |
+----+------+-------+      +------+-------+
| 1  |  A   |       | <--  |  A   |  v1   |
| 2  |  A   |       |      |  B   |  v2   |
| 3  |  B   |       |      |  A   |  v3   |
+----+------+-------+      |  A   |  v5   |
                           |  A   |  v6   |
                           +------+-------+
+-------------------+                      
|      table1       |                      
+-------------------+                      
| id | code | value |
+----+------+-------+
| 1  |  A   |  v6   |
| 2  |  A   |  v3   |
| 3  |  B   |  v2   |
+----+------+-------+

SQL更新语句怎么写? (MySQL 5.7)

最佳答案

这需要 Row_Number()窗口函数的魔力!不幸的是,您的 MySQL 版本是 5.7;所以使用 User-defined variables 的更详细的解决方案如下:

UPDATE 
table1 AS t1 

JOIN 

(SELECT 
   dt1.id, 
   IF(@cd1 = dt1.code, @rn1 := @rn1 + 1, 1) AS row_num1, 
   @cd1 := dt1.code AS code 
 FROM (SELECT id, code FROM table1 ORDER BY code, id) AS dt1
 CROSS JOIN (SELECT @rn1 := 0, @cd1 := '') AS init1
) AS t2 
  ON t2.id = t1.id 

JOIN 

(SELECT 
   IF(@cd2 = dt2.code, @rn2 := @rn2 + 1, 1) AS row_num2, 
   @cd2 := dt2.code AS code, 
   dt2.value 
 FROM (SELECT code, value FROM table2 ORDER BY code) AS dt2
 CROSS JOIN (SELECT @rn2 := 0, @cd2 := '') AS init2
) AS t3 
  ON t3.row_num2 = t2.row_num1 AND 
     t3.code = t2.code 

SET t1.value = t3.value 

你可以在这个 answer 中查看类似技术的解释。 .

关于mysql - SQL 语句 : how can I pick a value only once from a table to update another table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53229744/

相关文章:

mysql - 如何将带有子查询同表的MySQL select语句转换为update语句?

MySQL更新查询不更新表

javascript - 将 JavaScript 中的值直接插入 MySQL 数据库

mysql - 使用 Ruby on Rails 与数据库 mysql 的可视化界面

javascript - HTML 表单不会执行正确的操作,干扰

sql - 如何从命令行输入 SQL 查询,并以更简单的格式检索输出

mysql - 在 MySQL 中使用单个语句更新具有递增值的列

php - Docker-Compose 使用 PHP (MySQLi) 连接 MySQL 数据库

php - 我的查询获取 varchar 的最大值时出错

json - 从同一表中的其他列更新 JSONB 列数据