【问题标题】:Insert into table when row not exist else update table using Oracle SQL当行不存在时插入表中,否则使用 Oracle SQL 更新表
【发布时间】:2020-10-05 20:00:16
【问题描述】:

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

我创建了另一个表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_ORDER 表具有相同数据类型的VK_MODIFY 表。

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

【问题讨论】:

    标签: sql oracle merge


    【解决方案1】:

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

    【讨论】:

    • 实际上我收到错误 ORA-01722: invalid number 但我在 VK_MODIFY 表中创建了与 VK_ORDER 相同的列数据类型
    • 是因为日期数据类型吗? FIRST_INSERT_DATE 和 LATEST_MODIFY_DATE 数据类型为 TIMESTAMP(6) NOT NULL,FILENAME 数据类型 VARCHAR2(60) NOT NULL,OID 整数和 EXID VARCHAR2(100)
    • 查看更新后的答案。在INSERT 中添加了列名
    • 是的,查询现在正在运行,但问题是我看到 OID 和 EXID 在表中重复...我们可以忽略条件“将文件名附加到 FILENAME”,因为该列将来可能会超过,但表不应该有 OID 和 EXID 的冗余组合......对于相同的 OID,EXID 为空的冗余值也应该检查这个条件
    • 好的,在更新的答案中已经注意了。请立即检查!
    【解决方案2】:

    假设 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=系统日期 不匹配时插入 (oid,exid,filename,first_insert_date,latest_modify_date) 值(O.oid、O.exid、O.filename、sysdate、sysdate);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2014-10-23
      • 2019-02-21
      相关资源
      最近更新 更多