我继承了一组非常糟糕的数据,我的部分工作是检查并将其清理成实际可用的数据。目前,我正在尝试根据条目名称更新表中的列。
表:(类别目前几乎所有内容都为空)
+-----------------------------------------------------+
| programID | programName | programVersion | category |
+-----------------------------------------------------+
我的查询:
update Programs
set category="Adobe Suites"
where programName
in (
select distinct programName
from Programs
where programName regexp '^adobe.*cs[1-9]$'
);
问题是,无论我尝试什么,我都会不断收到错误消息:
ERROR 1093 (HY000):您不能在 FROM 子句中指定要更新的目标表“Programs”
我不确定还有什么其他方法可以做到这一点。关于如何用其他内容替换 from 语句的任何想法?
建议 #1
为什么要使用子查询?像这样尝试:
优点和缺点:更简单的查询,没有子查询,但是单次全表扫描。
建议#2
将不同的名称放在单独的表中,然后执行以下操作
UPDATE JOIN
:优点和缺点:干净
UPDATE JOIN
,但需要手动创建临时表。programName
如果在Programs
表中编入索引,这将很棒。警告
您收到该错误消息的原因很充分。它与 MySQL 查询优化器有关。回到 2011 年 2 月 22 日,我写了这篇文章的答案:MySQL 子查询问题。我提到过 MySQL 查询优化器有时会在优化过程中使行间歇性地消失。连接在内部不会是干净的。因此,MySQL 不是重写它,而是简单地踢出一个错误,这样就不必重写了。恕我直言,我认为这可能是由于 MySQL 与存储引擎交互的方式。
试试看 !!!
我真的不明白你为什么要使用那个毫无意义的子查询,这可以简单地通过这个基本查询来完成:
对不对?