sql - 当行不存在时插入表中,否则使用 Oracle SQL 更新表
问题描述
我正在使用 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 语句。
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)
)
解决方案
您可以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);
推荐阅读
- flutter - Flutter:建议列表更改时自动完成不显示建议
- python - 极地图:去除边缘?
- excel - 将 Access 表导出到 Excel,但每个名称都有不同的工作表
- java - 如何动态识别页面上的哪个html元素
- html - 将按钮与具有较大字体的图标对齐
- bash - &符号在后台运行进程会导致 Bash 5 中的参数无效
- azure-synapse - 如何在 Azure Synapse 中使用 FOR XML 路径
- sql-server - MS SQL 转置类似于 Excel 转置(动态 SQL)
- elasticsearch - 弹性搜索:将值限制为枚举列表
- typescript - 如何从 Typescript 中的类数组中排除属性类型