SQL - #1093 - Table '' 被指定了两次,既作为 'UPDATE' 的目标又作为单独的数据源
SQL - #1093 - Table '' is specified twice, both as a target for 'UPDATE' and as a separate source for data
我有这个代码:
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 - Table 'WORLD_TEST' is specified twice, both as a target for 'UPDATE' and as a separate source for data
编辑(来自评论的澄清): PROGRAMMER
和 LVL_PROGRAMMER
来自 WORLD_TEST
table 和 RECURSE_HOUR
, LVL
, MAX_RECURSE
来自 WORLD_TEST_PROGRAMMER
table.
错误消息很清楚,您不能在 UPDATE
子句中使用相同的 table 以及子查询的源。还有其他方法可以实现这一点,比如使用派生表等。在这种特殊情况下,您只需要在两个 table 之间 JOIN
。
此外,请不要使用旧的基于逗号的隐式连接并切换到现代 Explicit Join
based syntax
如果有多个table 查询,建议使用Aliasing 以提高代码可读性并避免模棱两可的行为。
根据您在 中的进一步说明,尝试以下操作:
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))
我有这个代码:
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 - Table 'WORLD_TEST' is specified twice, both as a target for 'UPDATE' and as a separate source for data
编辑(来自评论的澄清): PROGRAMMER
和 LVL_PROGRAMMER
来自 WORLD_TEST
table 和 RECURSE_HOUR
, LVL
, MAX_RECURSE
来自 WORLD_TEST_PROGRAMMER
table.
错误消息很清楚,您不能在 UPDATE
子句中使用相同的 table 以及子查询的源。还有其他方法可以实现这一点,比如使用派生表等。在这种特殊情况下,您只需要在两个 table 之间 JOIN
。
此外,请不要使用旧的基于逗号的隐式连接并切换到现代 Explicit Join
based syntax
如果有多个table 查询,建议使用Aliasing 以提高代码可读性并避免模棱两可的行为。
根据您在
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))