我有一个简单的mysql表:
CREATE TABLE IF NOT EXISTS pers
( persID
int(11) NOT NULL AUTO_INCREMENT, name
varchar(35) NOT NULL, gehalt
int(11) NOT NULL, chefID
int(11) DEFAULT NULL, PRIMARY KEY (persID
) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
INSERT INTO pers
(persID
, name
, gehalt
, chefID
) VALUES (1, 'blb', 1000, 3), (2, 'as', 1000, 3), (3, 'chef', 1040, NULL); 我尝试运行以下更新,但仅收到错误1093:
UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR gehalt < (SELECT ( SELECT MAX(gehalt * 1.05) FROM pers MA WHERE MA.chefID = MA.chefID) AS _pers ))
问题在于,无论出于何种原因,MySQL都不允许您编写如下查询:
UPDATE myTable SET myTable.A = ( SELECT B FROM myTable INNER JOIN ... ) 也就是说,如果你正在做一个UPDATE/ INSERT/ DELETE桌子上,你不能引用在内部查询表(您可以但是从外部表引用一个字段...)
解决方案是myTable将子查询中的实例替换为(SELECT * FROM myTable),如下所示
UPDATE myTable SET myTable.A = ( SELECT B FROM (SELECT * FROM myTable) AS something INNER JOIN ... ) 显然,这会导致将必需的字段隐式复制到临时表中,因此可以使用。
我在这里找到了这个解决方案。该文章的注释:
您不想SELECT * FROM table在现实生活中只进入子查询;我只是想使例子简单。实际上,您只应选择该最内部查询中所需的列,并添加一个良好的WHERE子句以限制结果。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。