我使用的是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表。我不确定如何编写这个sql语句,以及是否可以使用oracle sql语句。
与VK_ORDER表具有相同数据类型的VK_MODIFY表的DDL。
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)
)发布于 2020-06-16 17:03:49
您可以按如下方式使用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);发布于 2020-06-16 17:04:29
假设oid和exid都不为空,
merge into vk_modify M 匹配时使用(select * from vk_order) O on ((M.OID,M.EXID) = (O.OID,O.EXID))然后更新集合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);
https://stackoverflow.com/questions/62404629
复制相似问题