我需要更新我的一个表,似乎无法正确使用语法。我尝试了几种不同的方法,但没有吃午饭。
我收到的“SQL命令未正确结束”错误...
UPDATE TESTDTA.F4941
SET TESTDTA.F4941.RSDSTN=TESTDTA.F4981.FHRTDQ,TESTDTA.F4941.RSUMD1=TESTDTA.F4981.FHUOM
FROM TESTDTA.F4941
INNER JOIN TESTDTA.F4981
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN
WHERE TESTDTA.F4941.RSSHPN = 647143
AND TESTDTA.F4941.RSDSTN = 0
AND TESTDTA.F4941.RSADDJ > 110365
AND TESTDTA.F4981.FHCGC1 = 'DIS';
非常感谢任何协助。
谢谢,
答案 0 :(得分:1)
如前所述,您需要将设置移动到选择...之后,如下所示。但是我认为以前的建议缺少的是你需要为select中的每一列添加别名。 e.g。
UPDATE (SELECT TESTDTA.F4941.RSDSTN as A_RDSTN,TESTDTA.F4981.RSDSTN AS B_RSDSTN
FROM TESTDTA.F4941
INNER JOIN TESTDTA.F4981
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN
WHERE TESTDTA.F4941.RSSHPN = 647143
AND TESTDTA.F4941.RSDSTN = 0
AND TESTDTA.F4941.RSADDJ > 110365
AND TESTDTA.F4981.FHCGC1 = 'DIS')
SET A_RSDSTN = B_RSDSTN
为简洁起见,我只给出了一个列更新的示例。您需要单独为需要更新的每个列添加别名。
您还应注意,您需要在要更新的表上拥有主键或唯一索引。否则,您将获得“ORA-01779无法修改映射到非密钥保留表的列。”
答案 1 :(得分:0)
UPDATE (SELECT *
FROM TESTDTA.F4941
INNER JOIN TESTDTA.F4981
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN
WHERE TESTDTA.F4941.RSSHPN = 647143
AND TESTDTA.F4941.RSDSTN = 0
AND TESTDTA.F4941.RSADDJ > 110365
AND TESTDTA.F4981.FHCGC1 = 'DIS')
SET TESTDTA.F4941.RSDSTN=TESTDTA.F4981.FHRTDQ,TESTDTA.F4941.RSUMD1=TESTDTA.F4981.FHUOM
在连接后移动SET子句。
答案 2 :(得分:0)
我更喜欢merge
声明,当我必须加入
MERGE INTO TESTDTA.F4941
USING TESTDTA.F4981
ON (TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN
AND TESTDTA.F4941.RSSHPN = 647143
--AND TESTDTA.F4941.RSDSTN = 0
AND TESTDTA.F4941.RSADDJ > 110365
AND TESTDTA.F4981.FHCGC1 = 'DIS'
)
WHEN MATCHED THEN
UPDATE SET TESTDTA.F4941.RSDSTN=TESTDTA.F4981.FHRTDQ
,TESTDTA.F4941.RSUMD1=TESTDTA.F4981.FHUOM;
答案 3 :(得分:0)
您需要将SET
与SELECT
分开:
UPDATE TESTDTA.F4941
SET (TESTDTA.F4941.RSDSTN,TESTDTA.F4941.RSUMD1) =
(SELECT TESTDTA.F4981.FHRTDQ,TESTDTA.F4981.FHUOM
...
我的新代码......
UPDATE TESTDTA.F4941
SET TESTDTA.F4941.RSDSTN=TESTDTA.F4981.FHRTDQ,TESTDTA.F4941.RSUMD1=TESTDTA.F4981.FHUOM = (SELECT TESTDTA.F4941.RSSHPN,
TESTDTA.F4941.RSDSTN,
TESTDTA.F4941.RSUMD1,
TESTDTA.F4941.RSADDJ,
TESTDTA.F4981.FHSHPN,
TESTDTA.F4981.FHRTDQ,
TESTDTA.F4981.FHUOM,
TESTDTA.F4981.FHCGC1
FROM TESTDTA.F4941
INNER JOIN TESTDTA.F4981
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN
WHERE TESTDTA.F4941.RSSHPN = 647143
AND TESTDTA.F4941.RSDSTN = 0
AND TESTDTA.F4941.RSADDJ > 110365
AND TESTDTA.F4981.FHCGC1 = 'DIS';
答案 4 :(得分:0)
终于让这个工作......
MERGE INTO TESTDTA.F4941 DST
USING (SELECT DISTINCT TESTDTA.F4941.RSSHPN,
TESTDTA.F4941.RSDSTN,
TESTDTA.F4941.RSUMD1,
TESTDTA.F4941.RSADDJ,
TESTDTA.F4981.FHSHPN,
TESTDTA.F4981.FHRTDQ,
TESTDTA.F4981.FHUOM,
TESTDTA.F4981.FHCGC1
FROM TESTDTA.F4941
INNER JOIN TESTDTA.F4981
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN
WHERE TESTDTA.F4941.RSDSTN = 0
AND TESTDTA.F4941.RSADDJ > 110365
AND TESTDTA.F4981.FHCGC1 = 'DIS') SRC
ON (DST.RSSHPN = SRC.FHSHPN)
WHEN MATCHED THEN UPDATE
SET DST.RSDSTN = round(SRC.FHRTDQ/10000,0), DST.RSUMD1 = SRC.FHUOM;