带有JOIN和WHERE子句的Oracle UPDATE语法

时间:2013-12-09 18:24:46

标签: sql oracle sql-update inner-join where

我需要更新我的一个表,似乎无法正确使用语法。我尝试了几种不同的方法,但没有吃午饭。

我收到的“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';

非常感谢任何协助。

谢谢,

5 个答案:

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

您需要将SETSELECT分开:

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;