Pau*_*ter 160 mysql sql-update
我有两个表,并希望更新LEFT JOIN中所有行的T1字段.
举一个简单的例子,更新以下结果集的所有行:
SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.id = T2.id WHERE T2.id IS NULL
Run Code Online (Sandbox Code Playgroud)
在MySQL手册指出:
多表UPDATE语句可以使用SELECT语句中允许的任何类型的连接,例如LEFT JOIN.
但是我在文档化的多表UPDATE中找不到正确的语法.
什么是正确的语法?
Qua*_*noi 303
UPDATE t1
LEFT JOIN
t2
ON t2.id = t1.id
SET t1.col1 = newvalue
WHERE t2.id IS NULL
Run Code Online (Sandbox Code Playgroud)
请注意,SELECT使用NOT IN/ NOT EXISTSsyntax 会更有效:
SELECT t1.*
FROM t1
WHERE t1.id NOT IN
(
SELECT id
FROM t2
)
Run Code Online (Sandbox Code Playgroud)
有关性能详细信息,请参阅我博客中的文章:
LEFT JOIN比较NOT IN不幸的是,MySQL不允许在UPDATE语句中的子查询中使用目标表,这就是为什么你需要坚持使用效率较低的LEFT JOIN语法.
the*_*ges 27
同样可以应用于数据已规范化的场景,但现在您希望表在第三个表中找到值.以下内容允许您使用第二个表所喜欢的第三个表中的信息更新表.
UPDATE t1
LEFT JOIN
t2
ON
t2.some_id = t1.some_id
LEFT JOIN
t3
ON
t2.t3_id = t3.id
SET
t1.new_column = t3.column;
Run Code Online (Sandbox Code Playgroud)
这对于有用户和组的情况很有用,并且您希望用户能够添加他们自己的组名变体,因此最初您希望将现有组名导入到用户所在的字段中能够修改它.
Table A
+--------+-----------+
| A-num | text |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
+--------+-----------+
Table B
+------+------+--------------+
| B-num| date | A-num |
| 22 | 01.08.2003 | 2 |
| 23 | 02.08.2003 | 2 |
| 24 | 03.08.2003 | 1 |
| 25 | 04.08.2003 | 4 |
| 26 | 05.03.2003 | 4 |
Run Code Online (Sandbox Code Playgroud)
我将更新表 A 中的字段文本
UPDATE `Table A`,`Table B`
SET `Table A`.`text`=concat_ws('',`Table A`.`text`,`Table B`.`B-num`," from
",`Table B`.`date`,'/')
WHERE `Table A`.`A-num` = `Table B`.`A-num`
Run Code Online (Sandbox Code Playgroud)
并得到这个结果:
Table A
+--------+------------------------+
| A-num | text |
| 1 | 24 from 03 08 2003 / |
| 2 | 22 from 01 08 2003 / |
| 3 | |
| 4 | 25 from 04 08 2003 / |
| 5 | |
--------+-------------------------+
Run Code Online (Sandbox Code Playgroud)
其中仅接受表 B 中的一个字段,但我会得出以下结果:
Table A
+--------+--------------------------------------------+
| A-num | text |
| 1 | 24 from 03 08 2003 |
| 2 | 22 from 01 08 2003 / 23 from 02 08 2003 / |
| 3 | |
| 4 | 25 from 04 08 2003 / 26 from 05 03 2003 / |
| 5 | |
+--------+--------------------------------------------+
Run Code Online (Sandbox Code Playgroud)