sql-#1093-table“”被指定两次,既作为“update”的目标,也作为单独的数据源

yqkkidmi  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(283)

我有这个密码:

UPDATE WORLD_TEST 
SET PROGRAMMER = (SELECT (RECURSE_HOUR/360) 
                  FROM WORLD_TEST_PROGRAMMER, WORLD_TEST 
                  WHERE LVL = LVL_PROGRAMMER) 
WHERE (SELECT MAX_RECURSE 
       FROM WORLD_TEST_PROGRAMMER, WORLD_TEST 
       WHERE LVL = LVL_PROGRAMMER) 
>= 
(PROGRAMMER+(SELECT (RECURSE_HOUR/360) 
             FROM WORLD_TEST_PROGRAMMER, WORLD_TEST 
             WHERE LVL = LVL_PROGRAMMER));

出现此错误时:
1093-表“world\u test”被指定两次,既作为“update”的目标,也作为单独的数据源
编辑(评论澄清): PROGRAMMER 以及 LVL_PROGRAMMER 来自 WORLD_TEST table,和 RECURSE_HOUR , LVL , MAX_RECURSE 来自 WORLD_TEST_PROGRAMMER table。

ssm49v7z

ssm49v7z1#

错误信息非常清楚,您不能在中使用同一个表 UPDATE 子句以及子查询的源。还有其他方法可以实现这一点,比如使用派生表等。在这种情况下,您只需要 JOIN 在两张table之间。
另外,请不要使用旧的基于逗号的隐式联接,并切换到现代显式联接 Join 基于语法
在多表查询的情况下,建议使用别名以提高代码可读性并避免模棱两可的行为。
根据您在评论中的进一步澄清,请尝试以下操作:

UPDATE WORLD_TEST AS wt 
JOIN WORLD_TEST_PROGRAMMER AS wtp 
  ON wt.LVL_PROGRAMMER = wtp.LVL 
SET wt.PROGRAMMER = wtp.RECURSE_HOUR
WHERE wtp.MAX_RECURSE >= (wt.PROGRAMMER + (wtp.RECURSE_HOUR/360))

相关问题