用于获取结果并同时更新 table 列的 Oracle 脚本

Oracle script for getting results and update a table column in the same time

我需要你的帮助来创建一个脚本来获取结果,同时在必要时更新我的​​ table 中的一个字段。

在我的应用程序中,我有一些人 (table PERSON) 创建了 REQUESTS (table REQUEST)。如果一个人在过去 3 年内创建了一个请求,则该人处于活跃状态。我在 table PERSON 中创建了一个字段(ACTIVE - 默认值:1),以便了解此人是否仍然活跃。

我创建了一个查询来检索每个人的请求数(总请求数、活动请求、非活动请求):

-- PERSONS List with number of request for each person and RE_ACTIVE field
SELECT p.id,
       p.lastname || ' ' ||  p.firstname personname,
       p.company,
       p.active,
       (SELECT count(*)
        FROM request req
        WHERE req.personid = p.id) total_request_nb,
       (SELECT count(*)
        FROM request reqact
        WHERE reqact.personid = p.id
        AND reqact.requestdate > add_months(trunc(sysdate, 'YYYY'), -36)) nb_active_requests,
       (SELECT count(*)
        FROM request reqinact
        WHERE reqinact.personid = p.id
        AND reqinact.requestdate < add_months(trunc(sysdate, 'YYYY'), -36)) nb_inactive_requests,
       CASE
         WHEN EXISTS (SELECT *
                      FROM request reqreact
                      WHERE reqreact.personid = p.id
                      AND reqreact.requestdate > add_months(trunc(sysdate, 'YYYY'), -36)) 
         THEN 1 
         ELSE 0
       END re_active
FROM person p;

此脚本正在运行。当此人处于活动状态时(使用先前的结果),我想更新 ACTIVE 字段。例如:

UPDATE PERSON p SET ACTIVE =     
CASE  WHEN (
    (SELECT count(*)
     FROM request reqreact
      WHERE reqreact.personid = p.id
     AND reqreact.requestdate > add_months(trunc(sysdate, 'YYYY'), -36)) > 0
    )
    THEN 1 
    ELSE 0  
END   

我想知道是否可以在同一个脚本中做到这一点?因此我可以知道有多少更新已经完成,失败,......在一次查询中。

提前感谢您的帮助

您想要一个带有相关子查询的 WHERE EXISTS 条件:

UPDATE PERSON p
SET p.ACTIVE = 1
WHERE EXISTS (
    SELECT 1
    FROM request reqreact
    WHERE reqreact.personid = p.id
    AND reqreact.requestdate > add_months(trunc(sysdate, 'YYYY'), -36)
)

如果子查询中没有匹配,则外层查询中的UPDATE不会发生。

如果要根据子查询的结果设置为10

UPDATE PERSON p
SET p.ACTIVE = CASE 
    CASE
        WHEN EXISTS (
            SELECT 1
            FROM request reqreact
            WHERE reqreact.personid = p.id
            AND reqreact.requestdate > add_months(trunc(sysdate, 'YYYY'), -36)
        ) 
        THEN 1
        ELSE 0
    END