我有一个简单的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下面的页面http://dev.mysql.com/doc/refman/5.1/en/subquery-restrictions.html找到,但它没有帮助我。

我该怎么做来纠正sql查询?


当前回答

其他的解决方法包括在子查询中使用SELECT DISTINCT或LIMIT,尽管它们对物化的影响并不明确。这对我很有效

如MySql文档中所述

其他回答

MySQL不允许同时从一个表中进行选择和更新。但总有一个变通办法:)

这行不通>>>>

UPDATE table1 SET col1 = (SELECT MAX(col1) from table1) WHERE col1 IS NULL;

但这是可行的>>>>

UPDATE table1 SET col1 = (SELECT MAX(col1) FROM (SELECT * FROM table1) AS table1_new) WHERE col1 IS NULL;

其他的解决方法包括在子查询中使用SELECT DISTINCT或LIMIT,尽管它们对物化的影响并不明确。这对我很有效

如MySql文档中所述

这很简单。例如,不要写:

INSERT INTO x (id, parent_id, code) VALUES (
    NULL,
    (SELECT id FROM x WHERE code='AAA'),
    'BBB'
);

你应该写

INSERT INTO x (id, parent_id, code)
VALUES (
    NULL,
    (SELECT t.id FROM (SELECT id, code FROM x) t WHERE t.code='AAA'),
    'BBB'
);

或类似的。

从子查询创建临时表(tempP)

UPDATE pers P 
SET P.gehalt = P.gehalt * 1.05 
WHERE P.persID IN (
    SELECT tempP.tempId
    FROM (
        SELECT persID as tempId
        FROM pers P
        WHERE
            P.chefID IS NOT NULL OR gehalt < 
                (SELECT (
                    SELECT MAX(gehalt * 1.05) 
                    FROM pers MA 
                    WHERE MA.chefID = MA.chefID) 
                    AS _pers
                )
    ) AS tempP
)

我已经引入了一个单独的名称(别名),并为临时表的'persID'列提供了一个新名称

MariaDB从10.3开始取消了这一规定。x (DELETE和UPDATE):

UPDATE -具有相同源和目标的语句 从MariaDB 10.3.2开始,UPDATE语句可以具有相同的源和目标。 在MariaDB 10.3.1之前,下面的UPDATE语句将不起作用: UPDATE t1 SET c1=c1+1 WHERE c2=(SELECT (c2) FROM t1); 错误1093 (HY000):表't1'被指定两次, 既是“UPDATE”的目标,也是数据的独立来源 在MariaDB 10.3.2中,语句执行成功: UPDATE t1 SET c1=c1+1 WHERE c2=(SELECT (c2) FROM t1);


DELETE -相同的源和目标表 在MariaDB 10.3.1之前,从具有相同源和目标的表中删除是不可能的。从MariaDB 10.3.1开始,现在这是可能的。例如: DELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 WHERE b.c2=0);

DBFiddle MariaDB 10.2 -错误

DBFiddle MariaDB 10.3 -成功