我希望用匹配相同代码的 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/