为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕少森 2019-06-15 17:44:20
不能指定目标表以便在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查询?
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

问题是MySQL,无论出于什么愚蠢的原因,都不允许您编写这样的查询:

UPDATE myTableSET myTable.A =(
    SELECT B    FROM myTable    INNER JOIN ...)

也就是说,如果你做的是UPDATE/INSERT/DELETE在表上,不能在内部查询中引用该表(你能,会,可以然而,引用外表中的字段.)


的解决方案是替换myTable在子查询中(SELECT * FROM myTable),就像这样

UPDATE myTableSET myTable.A =(
    SELECT B    FROM (SELECT * FROM myTable) AS something    INNER JOIN ...)

这显然会导致将必要的字段隐式复制到临时表中,因此是允许的。

我找到了这个解决方案这里..该条的说明:

你不会想SELECT * FROM table在现实生活中的子查询中,我只想保持示例的简单性。实际上,您只应该在最内部的查询中选择所需的列,并添加一个好的WHERE子句来限制结果。


查看完整回答
反对 回复 2019-06-15
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

您可以分三步完成:

CREATE TABLE test2 ASSELECT PersId 
FROM pers pWHERE (
  chefID IS NOT NULL 
  OR gehalt < (
    SELECT MAX (
      gehalt * 1.05
    )
    FROM pers MA    WHERE MA.chefID = p.chefID  ))

...

UPDATE pers PSET P.gehalt = P.gehalt * 1.05WHERE PersIdIN (
  SELECT PersId  FROM test2)DROP TABLE test2;

UPDATE Pers P, (
  SELECT PersId  FROM pers p  WHERE (
   chefID IS NOT NULL 
   OR gehalt < (
     SELECT MAX (
       gehalt * 1.05
     )
     FROM pers MA     WHERE MA.chefID = p.chefID   )
 )) tSET P.gehalt = P.gehalt * 1.05WHERE p.PersId = t.PersId


查看完整回答
反对 回复 2019-06-15
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

在MySQL中,不能通过子查询同一个表来更新一个表。

可以将查询分为两部分,或执行以下操作

 UPDATE TABLE_A AS A
 INNER JOIN TABLE_A AS B ON A.field1 = B.field1
 SET field2 = ?


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 798 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信