当不存在行时插入到表中,否则使用oracle sql更新表

k4aesqcs  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(393)

我使用的是oracle数据库12c。我有 VK_ORDER 包含大量冗余数据的表,并带有列组合 OID 以及 EXID . 表中有列 FILENAME 其中,文件名是给定的,数据从中插入到该表中,并且该表具有 SYSTEM_INSERTED_AT 插入数据的日期和时间列。每天的作业都运行在这个表和冗余数据的组合上 OID 以及 EXID 正在插入此表。
我已经创建了另一个表 VK_MODIFY 包含以下列:

OID
EXID
FILENAME
FIRST_INSERT_DATE 
LATEST_MODIFY_DATE

现在我想写sql语句,我不确定 Merge sql语句在以下条件下工作:
如果列值的组合 OID, EXID 表中尚不存在,则:

- Insert a new row
- Set FIRST_INSERT_DATE = LATEST_MODIFY_DATE = now()
- Write the name of the file to FILENAME

如果列的组合值 OID, EXID 表中已存在,则:

- set LATEST_MODIFY_DATE = now()
- append the name of the file to FILENAME (prepend a comma – no space)

然后我就可以一天运行一次这个查询来更新我的 VK_MODIFY table。我不知道如何写这个sql语句,是否可以使用oraclesql语句。 DDL 为了 VK_MODIFY 与具有相同数据类型的表 VK_ORDER table。

CREATE TABLE
    VK_MODIFY
    (
     FIRST_INSERT_DATE TIMESTAMP(6) NOT NULL,  
     LATEST_MODIFY_DATE TIMESTAMP(6) NOT NULL, 
     FILENAME VARCHAR2(60) NOT NULL, 
     OID INTEGER,
     EXID VARCHAR2(100)
)
xdyibdwo

xdyibdwo1#

你可以用 MERGE 查询如下:

MERGE INTO VK_MODIFY T
USING (SELECT * FROM VK_ORDER) S
   ON (T.OID = S.OID AND (T.EXID = S.EXID OR (T.EXID IS NULL AND S.EXID IS NULL)))
WHEN MATCHED THEN
   UPDATE SET T.FILENAME = S.FILENAME || ',' || T.FILENAME,
              T.LATEST_MODIFY_DATE = SYSDATE
WHEN NOT MATCHED THEN
    INSERT(OID, EXID, FILENAME, FIRST_INSERT_DATE, LATEST_MODIFY_DATE) 
     VALUES (S.OID, S.EXID, S.FILENAME, SYSDATE, SYSDATE);
thtygnil

thtygnil2#

假设oid和exid都不为空,

merge into vk_modify M

匹配时使用(select*from vk|order)o on((m.oid,m.exid)=(o.oid,o.exid))然后更新set m.filename=m.filename | |','| | o.filename,latest|modify|date=sysdate当不匹配时插入(oid,exid,filename,first|insert|date,latest|modify|date)值(o.oid,o.exid,o.filename,sysdate,sysdate);

相关问题