2017-04-06 46 views
-1

代码:这是在Postgres 9.6.2上运行并给出语法错误的合并查询。什么是在PostgreSQL中编写“合并语句”的正确语法9.6.2

<<!--It is giving syntax error---> 
MERGE INTO timesheets.timesheet_report AS tgt USING timesheets.tmp_timesheet_report AS src ON src.FMNo = tgt.FMNo 
    AND src.ts_start_dt = tgt.ts_start_dt 
    AND src.charge_code = tgt.charge_code WHEN NOT MATCHED 
    INSERT (tgt.FIRST_NAME, 
      tgt.LAST_NAME) 
    VALUES(src.FIRST_NAME, 
      src.LAST_NAME) WHEN MATCHED 
    UPDATE 
    SET tgt.FIRST_NAME = src.FIRST_NAME, 
     tgt.LAST_NAME = src.LAST_NAME; 
+0

合并报表因供应商而异,将代码从一个RDMS粘贴到另一个RDMS并不意味着它应该起作用。 – Mokadillion

回答

1

这是ON CONFLICT

INSERT INTO table_name [your usual insert syntax here] 
ON CONFLICT [some conflict definition] 
DO UPDATE SET column1 = EXCLUDED.value1 

所以我想您的查询应该是这样的:

INSERT INTO timesheets.timesheet_report (FMNo, ts_start_dt, charge_code, FIRST_NAME, LAST_NAME) 
SELECT src.FMNo, src.ts_start_dt, src.charge_code, src.FIRST_NAME, src.LAST_NAME FROM timesheets.tmp_timesheet_report AS src 
ON CONFLICT (FMNo, ts_start_dt, charge_code) 
DO UPDATE 
SET FIRST_NAME = EXCLUDED.FIRST_NAME, 
    LAST_NAME = EXCLUDED.LAST_NAME; 

如果没有主键或唯一索引,那么你需要create unique index on timesheets.timesheet_report using btree (FMNo, ts_start_dt, charge_code);

+0

它也给语法错误 – Veenu

+0

你是对的,我纠正了代码。现在只说我缺少表格,所以应该没问题。 –