我有两个表,希望为左联接中的所有行更新T1中的字段.

举个简单的例子,更新以下结果集的所有行:

SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.id = T2.id WHERE T2.id IS NULL  

MySQL manual条规定:

多个表更新语句可以使用SELECT语句中允许的任何类型的联接,例如LEFT join.

但在有文档记录的多表更新中,我找不到这样做的正确语法.

正确的语法是什么?

推荐答案

UPDATE  t1
LEFT JOIN
        t2
ON      t2.id = t1.id
SET     t1.col1 = newvalue
WHERE   t2.id IS NULL

请注意,对于SELECT,使用NOT IN/NOT EXISTS语法更有效:

SELECT  t1.*
FROM    t1
WHERE   t1.id NOT IN
        (
        SELECT  id
        FROM    t2
        )

有关性能详细信息,请参阅我博客中的文章:

不幸的是,MySQL不允许在UPDATE语句的子查询中使用目标表,这就是为什么需要坚持使用效率较低的LEFT JOIN语法.

Mysql相关问答推荐

—符号在哪里条件""

加载数据本地infile,字段中有双引号和逗号

配置MySQL服务器以管理数千个表

在MySQL中查找具有公共值的列名

特定时间段内每个客户的运行总计

将时间戳四舍五入到最接近的半小时而不遗漏丢失的数据

基于关系的每个实体有一个真值和多个假值

为什么 MySQL 不使用索引进行简单的SELECT * FROM Table WHERE field='value'查询?

如何创建将行转换为列的 MySQL 查询?

Django中的MYSQL查询等效

如何使用同一个表在 2 个字段上左连接

为什么 fetch 方法不能获取任何东西?(feat node.js,restAPI)

MySql查询无结果

如何在 MySQL 中删除具有 2 列作为复合主键的多行?

MySQL使用多列 Select 重复记录

从终端访问 MAMP 的 MySQL

MySQL计算特定值的列

Amazon RDS Aurora 与 RDS MySQL 与 EC2 上的 MySQL?

MySQL - 在 MySQL UPDATE 或 SELECT 查询中使用 If Then Else

SQL WHERE 列 = 一切