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

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

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

  1. OID
  2. EXID
  3. FILENAME
  4. FIRST_INSERT_DATE
  5. LATEST_MODIFY_DATE

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

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

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

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

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

  1. CREATE TABLE
  2. VK_MODIFY
  3. (
  4. FIRST_INSERT_DATE TIMESTAMP(6) NOT NULL,
  5. LATEST_MODIFY_DATE TIMESTAMP(6) NOT NULL,
  6. FILENAME VARCHAR2(60) NOT NULL,
  7. OID INTEGER,
  8. EXID VARCHAR2(100)
  9. )
xdyibdwo

xdyibdwo1#

你可以用 MERGE 查询如下:

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

thtygnil2#

假设oid和exid都不为空,

  1. 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);

相关问题