首页 > 解决方案 > 通过加入4个表来更新sql表

问题描述

我试图通过加入 4 个表来更新 sql 表,下面是查询

UPDATE DC 
SET M_CA_PRO_ELG  = CPTY_UDF.M_CA_PRO_ELG
FROM COMD_TABLE DC
JOIN EXT_TABLE TRN_EXT ON DC.M_NB = TRN_EXT.M_REF
JOIN HDR_TABLE TRN_HDR ON TRN_EXT.M_TR_REF = TRN_HDR.M_NB 
JOIN CPDF_TABLE CPDF ON TRN_HDR.M_COUNTRPART= CPDF.M_ID
JOIN COUNTERP_TABLE CPTY_UDF ON CPDF.M_LBL=CPTY_UDF.M_LBL 
WHERE TRN_HDR.M_STATUS <> 'FISHING'

下面是遇到的错误

错误报告:SQL 错误:ORA-00933: SQL 命令未正确结束 00933. 00000 - “SQL 命令未正确结束”

更新 1:这个版本也不起作用,说 01407. 00000 -“无法将 (%s) 更新为 NULL”,但选择中根本没有空值

 update COMD_TABLE DC SET DC.M_CA_PRO_ELG = 
(
  select CPTY_UDF.M_CA_PRO_ELG  from COUNTERP_TABL CPTY_UDF,EXT_TABLE TRN_EXT,HDR_TABLE TRN_HDR ,CPDF_TABLE CPDF
  where DC.M_NB = TRN_EXT.M_REF and  TRN_EXT.M_TR_REF = TRN_HDR.M_NB  and TRN_HDR.M_COUNTRPART= CPDF.M_ID and CPDF.M_LBL=CPTY_UDF.M_LBL 
  and  TRN_HDR.M_STATUS <> 'FISHING'
)

更新 2:

WITH CA_PROVINCE_DATA AS 
(
 SELECT CPTY_UDF.M_CA_PRO_ELG AS CA_PRO ,DC.M_NB AS M_NB   
 FROM EXT_TABLE 
 JOIN HDR_TABLE TRN_HDR ON TRN_EXT.M_TR_REF = TRN_HDR.M_NB 
 JOIN CPDF_TABLE CPDF ON TRN_HDR.M_COUNTRPART= CPDF.M_ID
 JOIN COUNTERP_TABLE CPTY_UDF ON CPDF.M_LBL=CPTY_UDF.M_LBL 
 WHERE TRN_HDR.M_STATUS <> 'FISHING'
)
 UPDATE COMD_TABLE SET M_CA_PRO_ELG = CA_PROVINCE_DATA.CA_PRO WHERE 
 M_NB= CA_PROVINCE_DATA.M_NB

此查询在 ORACLE 中是否有效,或者是否有任何其他方法可以实现此目的。

感谢你的帮助

谢谢

标签: sqloraclejoinsql-updateora-00933

解决方案


对我来说,这看起来像是 SQL Server 更新。我喜欢的 SQL Server 的一个功能。我相信您正在寻找的 Oracle 更新如下。如果您希望更新所有记录,请忽略“存在位置”部分。

UPDATE dc
   SET m_ca_pro_elg   =
           (SELECT cpty_udf.m_ca_pro_elg
              FROM ext_table  trn_ext
                   JOIN hdr_table trn_hdr ON trn_ext.m_tr_ref = trn_hdr.m_nb
                   JOIN cpdf_table cpdf ON trn_hdr.m_countrpart = cpdf.m_id
                   JOIN counterp_table cpty_udf
                       ON cpdf.m_lbl = cpty_udf.m_lbl
             WHERE dc.m_nb = trn_ext.m_ref AND trn_hdr.m_status <> 'FISHING')
 WHERE EXISTS
           (SELECT NULL
              FROM ext_table  trn_ext
                   JOIN hdr_table trn_hdr ON trn_ext.m_tr_ref = trn_hdr.m_nb
                   JOIN cpdf_table cpdf ON trn_hdr.m_countrpart = cpdf.m_id
                   JOIN counterp_table cpty_udf
                       ON cpdf.m_lbl = cpty_udf.m_lbl
             WHERE dc.m_nb = trn_ext.m_ref AND trn_hdr.m_status <> 'FISHING')

推荐阅读