【问题标题】:MYSQL - Subquery on same table in WHERE clause of UPDATE statementMYSQL - UPDATE 语句的 WHERE 子句中同一表的子查询
【发布时间】:2017-12-10 05:10:07
【问题描述】:

我收到了一个“错误'#1093 - 您不能在 FROM 子句中指定目标表 't1' 进行更新”,代码如下:

UPDATE `table1` t1 SET t1.name = 'abc'
WHERE t1.id = 165 AND NOT EXISTS (
    SELECT t2.id FROM `table1` t2 WHERE t2.id != 165 AND t2.name = 'abc'    
)

但是代码没有问题:

UPDATE `table1` t1 SET t1.name = 'abc'
WHERE t1.id = 165 AND NOT EXISTS (
    SELECT t2.id FROM `table2` t2 WHERE t2.id != 165 AND t2.name = 'abc'    
)

我做错了什么?

【问题讨论】:

标签: mysql


【解决方案1】:

您可以实现相同的目标,而无需使用内部查询:

UPDATE `table1` t1 SET t1.name = 'abc'
WHERE t1.id = 165 AND t1.name != 'abc'  

【讨论】:

  • 和我想得到的不一样
【解决方案2】:

您可以将此查询改写为同一张表的自联接:

UPDATE table1 t1
LEFT JOIN table1 t2
    ON t2.id != 165 AND t2.name = 'abc'
SET t1.name = 'abc'
WHERE t1.id = 165 AND t2.name IS NULL

这里的更新逻辑是您的NOT EXISTS 子句已替换为LEFT JOIN,其中连接左侧的任何记录与任何记录匹配(t2.name IS NULL)其中id 不是 165,名称是 abc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多