SQL-#1093-表''被指定两次,既作为'UPDATE'的目标又作为数据的单独来源

时间:2018-11-09 09:33:19

标签: mysql sql sql-update updates

我有此代码:

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_TEST'被指定两次,既作为'UPDATE'的目标,又作为数据的单独来源

编辑(注释中的说明)PROGRAMMERLVL_PROGRAMMER来自WORLD_TEST表,而RECURSE_HOURLVL MAX_RECURSE来自WORLD_TEST_PROGRAMMER表。

1 个答案:

答案 0 :(得分:2)

错误消息非常清楚,您不能在UPDATE子句中使用相同的表以及子查询的源。还有其他方法可以实现此目的,例如使用派生表等。在这种特定情况下,您只需要在两个表之间JOIN

另外,请不要使用基于旧逗号的隐式联接并切换到现代Explicit Join based syntax

对于多表查询,建议使用Aliasing以提高代码可读性并避免歧义行为。

根据您在comments中的进一步说明,尝试以下操作:

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))