Database 针对特定场景,将Select Oracle查询转换为Updte

Database 针对特定场景,将Select Oracle查询转换为Updte,database,oracle,updates,oracle12c,insert-update,Database,Oracle,Updates,Oracle12c,Insert Update,我们正在使用Oracle v12+ 在这种情况下,每当我们对每个代码进行第一次更新时,我们需要将status列更新为previous值,因为它是函数ID,并且有许多行与一个ID相对,否则需要添加 请参见下面的示例i/o。数据按每个ID的时间戳排序 我们需要特定的联接来更新吗?我已经将数据复制到临时表中,但没有成功 表名称:表\账簿\状态 在stackOverflow社区的帮助下,我们能够创建一个select查询 SELECT code, status, CASE WHEN

我们正在使用Oracle v12+

在这种情况下,每当我们对每个代码进行第一次更新时,我们需要将status列更新为previous值,因为它是函数ID,并且有许多行与一个ID相对,否则需要添加

请参见下面的示例i/o。数据按每个ID的时间戳排序

我们需要特定的联接来更新吗?我已经将数据复制到临时表中,但没有成功

表名称:表\账簿\状态

在stackOverflow社区的帮助下,我们能够创建一个select查询

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

这会根据需要提供完美的结果,但在select视图中,我们希望将其转换为更新oracle查询或PL/SQL。关于这方面的任何建议。

从查询更新表的一个好方法是使用MERGE语句。下面是一个复制所有_对象并添加一列与该行所有者和类型匹配的对象数的示例

CREATE TABLE all_objects_2 AS
SELECT *
  FROM all_objects;

ALTER TABLE all_objects_2 add owner_and_type_ct NUMBER;

MERGE INTO all_objects_2 ao2
USING (SELECT ao.owner,
              ao.object_type,
              COUNT(*) AS ct
         FROM all_objects ao
        GROUP BY ao.owner,
                 ao.object_type) x
ON (ao2.owner = x.owner AND ao2.object_type = x.object_type)
WHEN MATCHED THEN
  UPDATE
     SET ao2.owner_and_type_ct = x.ct;

SELECT ao2.owner,
       ao2.object_name,
       ao2.object_type,
       ao2.owner_and_type_ct
  FROM all_objects_2 ao2
 WHERE rownum < 10;
/*
SYS C_TS# CLUSTER 10
SYS I_TS# INDEX 1459
SYS C_FILE#_BLOCK#  CLUSTER 10
SYS I_FILE#_BLOCK#  INDEX 1459
SYS FET$  TABLE 1592
SYS UET$  TABLE 1592
SYS SEG$  TABLE 1592
SYS UNDO$ TABLE 1592
SYS TS$ TABLE 1592
*/
您可以使用[criteria to join query to destination]上的[your query]合并到[destination table],并在匹配行时使用查询中的值更新该行。您也可以通过合并进行插入和删除,但我不会复制所有的

CREATE TABLE all_objects_2 AS
SELECT *
  FROM all_objects;

ALTER TABLE all_objects_2 add owner_and_type_ct NUMBER;

MERGE INTO all_objects_2 ao2
USING (SELECT ao.owner,
              ao.object_type,
              COUNT(*) AS ct
         FROM all_objects ao
        GROUP BY ao.owner,
                 ao.object_type) x
ON (ao2.owner = x.owner AND ao2.object_type = x.object_type)
WHEN MATCHED THEN
  UPDATE
     SET ao2.owner_and_type_ct = x.ct;

SELECT ao2.owner,
       ao2.object_name,
       ao2.object_type,
       ao2.owner_and_type_ct
  FROM all_objects_2 ao2
 WHERE rownum < 10;
/*
SYS C_TS# CLUSTER 10
SYS I_TS# INDEX 1459
SYS C_FILE#_BLOCK#  CLUSTER 10
SYS I_FILE#_BLOCK#  INDEX 1459
SYS FET$  TABLE 1592
SYS UET$  TABLE 1592
SYS SEG$  TABLE 1592
SYS UNDO$ TABLE 1592
SYS TS$ TABLE 1592
*/