【发布时间】:2020-05-23 01:14:44
【问题描述】:
我们正在使用 Oracle v12+
我们有一种情况,我们需要更新status 列到以前的值,每当我们为每个code 拥有第一个RENEWAL 时(它是功能ID,并且针对一个ID 有很多行) 否则ADD。
请参阅下面的示例 i/o。数据按每个 ID 的时间戳排序。
我们需要特定的连接来更新吗?为此,我已将数据复制到临时表中,但没有成功。
表名:table_book_status
Input CLOB
[code] [word] [status] [timestamp]
B000JMLBHU book {"name" : "Kunal", "type" : "RENEWAL"}
B000JMLBHU read {"name" : "Kunal", "type" : "RENEWAL"}
B000JMLBHU was {"name" : "Kunal", "type" : "MODIFY"}
B000JMLBHU story {"name" : "Kunal", "type" : "ADD"}
B000R93D4Y with {"name" : "RAHUL", "type" : "RENEWAL"}
B000R93D4Y book {"name" : "RAHUL", "type" : "RENEWAL"}
B000R93D4Y story {"name" : "RAHUL", "type" : "RENEWAL"}
B000R93D4Y was {"name" : "RAHUL", "type" : "MODIFY"}
B000R93D4Y have {"name" : "RAHUL", "type" : "ADD"}
B001892DGG was {"name" : "Kanav", "type" : "ADD"}
B001892DWA was {"name" : "Kavita", "type" : "ADD"}
B001BXNQ2O was {"name" : "Keshav", "type" : "RENEWAL"}
B001BXNQ2O book {"name" : "Keshav", "type" : "RENEWAL"}
B001H55R8M was {"name" : "Raghav", "type" : "MODIFY"}
B001HQHCBQ was {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ story {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ bella {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ with {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ love {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ zsadist {"name" : "RINA", "type" : "ADD"}
Output
[code] [word] [status] [timestamp]
B000JMLBHU book {"name" : "Kunal", "type" : "RENEWAL"}
B000JMLBHU read {"name" : "Kunal", "type" : "**MODIFY**"}
B000JMLBHU was {"name" : "Kunal", "type" : "MODIFY"}
B000JMLBHU story {"name" : "Kunal", "type" : "ADD"}
B000R93D4Y with {"name" : "RAHUL", "type" : "RENEWAL"}
B000R93D4Y book {"name" : "RAHUL", "type" : "RENEWAL"}
B000R93D4Y story {"name" : "RAHUL", "type" : "**MODIFY**"}
B000R93D4Y was {"name" : "RAHUL", "type" : "MODIFY"}
B000R93D4Y have {"name" : "RAHUL", "type" : "ADD"}
B001892DGG was {"name" : "Kanav", "type" : "ADD"}
B001892DWA was {"name" : "Kavita", "type" : "ADD"}
B001BXNQ2O was {"name" : "Keshav", "type" : "RENEWAL"}
B001BXNQ2O book {"name" : "Keshav", "type" : "**ADD**"}
B001H55R8M was {"name" : "Raghav", "type" : "MODIFY"}
B001HQHCBQ was {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ story {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ bella {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ with {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ love {"name" : "RINA", "type" : "ADD"}
B001HQHCBQ zsadist {"name" : "RINA", "type" : "ADD"}
在 stackOverflow 社区的帮助下,我们能够创建一个选择查询
SELECT code,
status,
CASE
WHEN sm = 1
AND status = 'RENEWAL'
THEN COALESCE(lgst, 'ADD')
ELSE status
END AS status1,
timestamp
FROM
(SELECT code,
JSON_VALUE(status, '$.type') AS status,
SUM(
CASE
WHEN JSON_VALUE(status, '$.type') = 'RENEWAL'
THEN 1
ELSE 0
END) over (partition BY code order by timestamp) AS sm,
lag(JSON_VALUE(status, '$.type')) over (partition BY code order by timestamp) AS lgst,
timestamp
FROM table_book_status
);
这会根据需要提供完美的结果,但在选择视图中,我们希望将其转换为 UPDATE oracle 查询或 PL/SQL。对此有何建议。
【问题讨论】:
标签: database oracle updates oracle12c insert-update