不能指定目标表以便在FROM子句中更新

不能指定目标表以便在FROM子句中更新

我有一个简单的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/reflman/5.1/en/subquery-strations.html但这帮不了我。

如何纠正SQL查询?


慕少森
浏览 803回答 3
3回答

慕妹3146593

问题是MySQL,无论出于什么愚蠢的原因,都不允许您编写这样的查询:UPDATE&nbsp;myTableSET&nbsp;myTable.A&nbsp;=( &nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;myTable&nbsp;&nbsp;&nbsp;&nbsp;INNER&nbsp;JOIN&nbsp;...)也就是说,如果你做的是UPDATE/INSERT/DELETE在表上,不能在内部查询中引用该表(你能,会,可以然而,引用外表中的字段.)的解决方案是替换myTable在子查询中(SELECT * FROM myTable),就像这样UPDATE&nbsp;myTableSET&nbsp;myTable.A&nbsp;=( &nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;(SELECT&nbsp;*&nbsp;FROM&nbsp;myTable)&nbsp;AS&nbsp;something&nbsp;&nbsp;&nbsp;&nbsp;INNER&nbsp;JOIN&nbsp;...)这显然会导致将必要的字段隐式复制到临时表中,因此是允许的。我找到了这个解决方案这里..该条的说明:你不会想SELECT * FROM table在现实生活中的子查询中,我只想保持示例的简单性。实际上,您只应该在最内部的查询中选择所需的列,并添加一个好的WHERE子句来限制结果。

德玛西亚99

您可以分三步完成:CREATE&nbsp;TABLE&nbsp;test2&nbsp;ASSELECT&nbsp;PersId&nbsp; FROM&nbsp;pers&nbsp;pWHERE&nbsp;( &nbsp;&nbsp;chefID&nbsp;IS&nbsp;NOT&nbsp;NULL&nbsp; &nbsp;&nbsp;OR&nbsp;gehalt&nbsp;<&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;MAX&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gehalt&nbsp;*&nbsp;1.05 &nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;pers&nbsp;MA&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;MA.chefID&nbsp;=&nbsp;p.chefID&nbsp;&nbsp;))...UPDATE&nbsp;pers&nbsp;PSET&nbsp;P.gehalt&nbsp;=&nbsp;P.gehalt&nbsp;*&nbsp;1.05WHERE&nbsp;PersIdIN&nbsp;( &nbsp;&nbsp;SELECT&nbsp;PersId&nbsp;&nbsp;FROM&nbsp;test2)DROP&nbsp;TABLE&nbsp;test2;或UPDATE&nbsp;Pers&nbsp;P,&nbsp;( &nbsp;&nbsp;SELECT&nbsp;PersId&nbsp;&nbsp;FROM&nbsp;pers&nbsp;p&nbsp;&nbsp;WHERE&nbsp;( &nbsp;&nbsp;&nbsp;chefID&nbsp;IS&nbsp;NOT&nbsp;NULL&nbsp; &nbsp;&nbsp;&nbsp;OR&nbsp;gehalt&nbsp;<&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;MAX&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gehalt&nbsp;*&nbsp;1.05 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;pers&nbsp;MA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;MA.chefID&nbsp;=&nbsp;p.chefID&nbsp;&nbsp;&nbsp;) &nbsp;))&nbsp;tSET&nbsp;P.gehalt&nbsp;=&nbsp;P.gehalt&nbsp;*&nbsp;1.05WHERE&nbsp;p.PersId&nbsp;=&nbsp;t.PersId

缥缈止盈

在MySQL中,不能通过子查询同一个表来更新一个表。可以将查询分为两部分,或执行以下操作&nbsp;UPDATE&nbsp;TABLE_A&nbsp;AS&nbsp;A &nbsp;INNER&nbsp;JOIN&nbsp;TABLE_A&nbsp;AS&nbsp;B&nbsp;ON&nbsp;A.field1&nbsp;=&nbsp;B.field1 &nbsp;SET&nbsp;field2&nbsp;=&nbsp;?
打开App,查看更多内容
随时随地看视频慕课网APP