Sql oracle 11,更新加入

Sql oracle 11,更新加入,sql,oracle,join,Sql,Oracle,Join,我有这样一个SQL语句: UPDATE tbl SET old_ht = new_ht, old_ttc = new_ttc from table1 tbl join table2 temp ON trim(temp.val_code) = trim(tbl.val_code) AND trim(temp.tv_code) = trim(tbl.tv_code) INNER JOIN table3 tbl3 ON trim(tbl3.oma_COD

我有这样一个SQL语句:

UPDATE tbl
SET old_ht = new_ht,
    old_ttc = new_ttc
from table1 tbl 
join table2 temp ON trim(temp.val_code) = trim(tbl.val_code) 
                 AND trim(temp.tv_code) = trim(tbl.tv_code)
INNER JOIN table3 tbl3 ON  trim(tbl3.oma_CODE) =trim(temp.oma_CODE) 
                       AND trim(tbl3.men_CODE) =trim(temp.men_CODE) 
                       AND  trim(tbl3.gov_CODE) =trim(gov.BRD_CODE)
                       and tbl3.fld_id = tbl.fld_id  ;
但Oracle似乎不支持这种语法

我也试过:

UPDATE ( select tbl.cost_ht as old_ht, temp.cost_ht as new_ht,tbl.cost_ttc as old_ttc
                ,  temp.cost_ttc as new_ttc
         from table1 tbl 
         join table2 temp ON trim(temp.val_code) = trim(tbl.val_code) 
                 AND trim(temp.tv_code) = trim(tbl.tv_code)
         INNER JOIN table3 tbl3 ON  trim(tbl3.oma_CODE) =trim(temp.oma_CODE) 
                       AND trim(tbl3.men_CODE) =trim(temp.men_CODE) 
                       AND  trim(tbl3.gov_CODE) =trim(gov.BRD_CODE)
                       and tbl3.fld_id = tbl.fld_id )
SET old_ht = new_ht, old_ttc = new_ttc
但我得到了这个错误:

错误报告:

SQL错误:
ORA-01779:无法修改映射到非键保留表01779的列。00000-“无法修改映射到非键保留表的列”
*原因:试图插入或更新连接视图的列,但 映射到非键保留表。
*操作:直接修改基础基表


就这么简单。。通过此索引为您的发动机提供更多信心

CREATE UNIQUE INDEX IDX1
    ON TABLE1 ( VAL_CODE,TV_CODE );

CREATE UNIQUE INDEX IDX2
    ON TABLE2 ( VAL_CODE,TV_CODE, OMA_CODE ,MEN_CODE );

CREATE UNIQUE INDEX IDX3
    ON TABLE3 ( OMA_CODE ,MEN_CODE, GOV_CODE  );
然后尝试您的查询,该查询应该运行良好

UPDATE
      (SELECT
            TBL.COST_HT AS OLD_HT,
            TEMP.COST_HT AS NEW_HT,
            TBL.COST_TTC AS OLD_TTC,
            TEMP.COST_TTC AS NEW_TTC
       FROM
            TABLE1 TBL
            JOIN TABLE2 TEMP
                ON TRIM ( TEMP.VAL_CODE ) = TRIM ( TBL.VAL_CODE )
                   AND TRIM ( TEMP.TV_CODE ) = TRIM ( TBL.TV_CODE )
            INNER JOIN TABLE3 TBL3
                ON      TRIM ( TBL3.OMA_CODE ) = TRIM ( TEMP.OMA_CODE )
                   AND TRIM ( TBL3.MEN_CODE ) = TRIM ( TEMP.MEN_CODE )
                   AND TRIM ( TBL3.GOV_CODE ) = TRIM ( GOV.BRD_CODE )
                   AND TBL3.FLD_ID = TBL.FLD_ID)
SET
      OLD_HT        = NEW_HT,
      OLD_TTC     = NEW_TTC;

也许提供一个表的例子并解释你想做什么。你的DBMS在抱怨,因为它不认为它只能在你选择的结果中只看到一次TBL记录。因此,您无法更新此视图,但必须更新表。但在表1中,我可以有许多具有相同(VAL_代码、TV_代码)的记录。我必须添加“FLD_ID”以获取uniques记录。对于表2,我必须在表3中使用VAL_代码、OMA_代码、MEN_代码、GOV_代码Yes。更新答案