根据 MySQL 中的连接结果更新表
Posted
技术标签:
【中文标题】根据 MySQL 中的连接结果更新表【英文标题】:update a table based on the outcome of a join in MySQL 【发布时间】:2016-01-30 09:06:15 【问题描述】:我理解这里的语法:
UPDATE table
SET column1 = expression1,
column2 = expression2,
...
WHERE conditions;
这里:
UPDATE table1
SET column1 = (SELECT expression1
FROM table2
WHERE conditions)
WHERE conditions;
...但是如果我想更新怎么办
UPDATE table1
SET column1 = expression
if we get a particular result on a join between table1 and table2
which has WHERE conditions?
我似乎无法弄清楚,而且我在所有尝试中都遇到了语法错误。非常感谢任何建议。
【问题讨论】:
【参考方案1】:mysql 中的语法是:
UPDATE table1 JOIN
table2
ON conditions
SET table1.column1 = table2.expression1
WHERE conditions;
【讨论】:
回过头来看看它,它的语法令人困惑,因为它以UPDATE
开头,但真正的更新在SET
语句中进行得更远。好像关键字UPDATE
真的不需要在那里。我觉得你可以将关键字UPDATE
更改为FOO
并且不会丢失信息。
@MonicaHeddneck 。 . . update
指定正在操作的表。 set
指定列。这实际上与select
和from
的区别相同。 Update
更合理(在我看来),因为它首先定义了数据源。
所以基本上你说UPDATE
是UPDATE TABLE
的缩写。【参考方案2】:
我要做的是先把它写成一个 SELECT 语句。
SELECT t.id
, t.col AS old_val
, s.expr AS new_val
FROM target_table t
JOIN source_table s
ON s.somecol = t.somecol
AND s.othercol < 1
WHERE s.something_else = 'abc'
在此示例中,t.col
是我(最终)要为其分配新值的列。 (这里的SELECT语句中使用,这里只显示当前存储在列中的值。)
表达式s.expr
表示返回我要分配给col
的值的表达式。这可以像列引用一样简单,也可以是更复杂的表达式。
语句的其余部分是我们熟悉的普通FROM
、JOIN
、ON
和WHERE
子句。
一旦我有一个正在工作的SELECT
语句,我就可以通过
UPDATE
替换SELECT ... FROM
(在语句的开头)
在 WHERE
子句之前添加 SET
子句。
例如,我会将上面的 SELECT 语句转换为类似的内容,以将 s.expr
的值分配给 t.col
:
UPDATE target_table t
JOIN source_table s
ON s.somecol = t.somecol
AND s.othercol < 1
SET t.col = s.expr
WHERE s.something_else = 'abc'
这是适合我的方法。首先将其编写为 SELECT 允许我进行测试、处理条件和表达式,并查看以验证将更新哪些行、替换哪些值以及将为每一行分配哪些值。
【讨论】:
以上是关于根据 MySQL 中的连接结果更新表的主要内容,如果未能解决你的问题,请参考以下文章