合并表:SQL

时间:2013-12-06 20:32:22

标签: sql database oracle merge

我正在尝试使用merge语句添加到manager_copy_d_cds表中,来自的CD 原始表。如果匹配,我将更新标题和年份。如果没有,我想插入原始表中的数据

我收到的错误是这样的: ORA-01747:user.table.column,table.column或列规范无效

merge into manager_copy_d_cds m using d_cds c  
on (m.cd_number = c.cd_number)  
when matched then update  
set (m.title = c.title, m.year = c.year)  
when not matched then insert   
values (c.cd_number, c.title, c.producer, c.year);  

表格结构:

CD_NUMBER - NUMBER(5,0) - Not nullable   -  primary key(1)  
TITLE - VARCHAR2(50) - Not nullable  -   -  
PRODUCER - VARCHAR2(50) - Not nullable   -   -  
YEAR - VARCHAR2(4) - Not nullable    -   -  

我错过了什么?

2 个答案:

答案 0 :(得分:0)

逻辑上,您不需要在VALUES()子句中使用表别名或UPDATE子句中的目标列名称作为前缀,因此我怀疑您可以删除一个或另一个或两者。

尝试:

merge into manager_copy_d_cds m using d_cds c  
on (m.cd_number = c.cd_number)  
when matched then update  
set (title = c.title, year = c.year)  
when not matched then insert   
values (cd_number, title, producer, year);  

答案 1 :(得分:0)

我看了看。 Oracle Merge Statement使用了

的示例
MERGE INTO bonuses D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT  (D.employee_id, D.bonus)
     VALUES (S.employee_id, S.salary*.01)
     WHERE (S.salary <= 8000);

注意这是在insert语句附近:(指定了列名) INSERT(D.employee_id,D.bonus)