首页 > 解决方案 > 当行不存在时插入表中,否则使用 Oracle SQL 更新表

问题描述

我正在使用 Oracle 数据库 12C。我有一个VK_ORDER表,其中包含大量冗余数据,并结合了列OIDEXID. 该表有一列FILENAME,其中给出了文件名,数据从该列中插入到该表中,并且该表有SYSTEM_INSERTED_AT一列,该列是在哪个日期时间插入数据的。日常工作在这张表上运行,并且组合的冗余数据OIDEXID插入到这张表中。

我创建了另一个VK_MODIFY包含以下列的表:

OID
EXID
FILENAME
FIRST_INSERT_DATE 
LATEST_MODIFY_DATE 

现在我想编写 sql 语句我不确定Mergesql 语句是否适用于以下条件:

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表。我不确定如何编写这个 sql 语句以及是否可以使用 oracle sql 语句。

DDL对于与VK_MODIFY表具有相同数据类型的VK_ORDER表。

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)
)

标签: sqloraclemerge

解决方案


您可以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);

推荐阅读