【发布时间】:2019-03-28 19:48:07
【问题描述】:
我收到错误“ORA-01779:无法修改映射到非键保留表的列”:
UPDATE
(SELECT P.SERVICE_DATE_OUT AS P_DATEOUT, P.SERVICE_DATE_IN AS P_DATEIN
FROM TRANSLOG TL JOIN PMEQMT P ON TL.ITEMNO = P.EQNO
WHERE TL.LOC_DESC = 'E-IN SERVICE')
SET P_DATEOUT = NULL, P_DATEIN = NULL
经过研究,我认为此错误是由于创建内联视图和更新尝试更新两个表而不是我想要的表?谁能证实这一点?有解决办法吗?
为了进一步解释我的场景,我已经构建了另外两个查询,这些查询将在上述查询运行之前每天运行(如果我可以让某些东西正常运行)。
第一:
UPDATE PMEQMT P
SET SERVICE_DATE_OUT = (SELECT MAX(TL.TRANS_DATE)
FROM TRANSLOG TL
WHERE P.EQNO = TL.ITEMNO AND
TL.LOC_DESC = 'E-OUT OF SERVICE' AND
TL.TRANS_DATE >= SYSDATE - 1 AND
TL.TRANS_IN_OUT = 'IN'
)
WHERE P.CLASS = 'TL' AND
P.SERVICE_DATE_OUT IS NULL
第二:
UPDATE PMEQMT P
SET SERVICE_DATE_IN =
CASE
WHEN SERVICE_DATE_IN IS NULL THEN (SELECT MAX(TL.TRANS_DATE)
FROM TRANSLOG TL
WHERE P.EQNO = TL.ITEMNO AND
TL.LOC_DESC = 'E-IN SERVICE' AND
TL.TRANS_DATE >= SYSDATE - 1 AND
TL.TRANS_IN_OUT = 'IN'
)
WHEN (TRUNC(SERVICE_DATE_IN)) <= (TRUNC(SYSDATE)) THEN (SELECT ((TRUNC(SYSDATE))+1)
FROM TRANSLOG TL
WHERE P.EQNO = TL.ITEMNO AND
TL.LOC_DESC = 'E-OUT OF SERVICE'
)
WHEN (TRUNC(SERVICE_DATE_IN)) > (TRUNC(SYSDATE)) THEN (SELECT SERVICE_DATE_IN
FROM TRANSLOG TL
WHERE P.EQNO = TL.ITEMNO AND
TL.LOC_DESC = 'E-OUT OF SERVICE'
)
END
WHERE CLASS = 'TL'
有没有办法把这些结合起来?如果第一个查询起作用,那么所有三个都可以运行,如果没有,那么最后两个?将它们结合起来是否有意义,或者我最好将它们分开?
非常感谢任何输入。
【问题讨论】:
-
第一个无法工作,因为您正在尝试更新查询而不是表。这就像尝试更新视图。我认为,对于第一个,您需要类似: UPDATE PMEQMT P SET P_DATEOUT = NULL, P_DATEIN = NULL WHERE EXISTS (SELECT 1 FROM TRANSLOG TL WHERE TL.ITEMNO = P.EQNO AND TL.LOC_DESC = 'E-IN SERVICE ')
-
Susan 的更新看起来不错。但仅供参考,您实际上可以更新子查询或视图 - 只是有限制。在这里,优化器抱怨它不能保证(使用主键/唯一键)您的子查询将返回一组唯一的行。看到这个问汤姆:asktom.oracle.com/pls/asktom/…
-
我学到了一些新东西。谢谢你。 :)
标签: sql oracle sql-update case