我有此代码:
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'的目标,又作为数据的单独来源
编辑(注释中的说明):PROGRAMMER
和LVL_PROGRAMMER
来自WORLD_TEST
表,而RECURSE_HOUR
,LVL
MAX_RECURSE
来自WORLD_TEST_PROGRAMMER
表。
答案 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))