Сценарий Oracle для получения результатов и одновременного обновления столбца таблицы - PullRequest
0 голосов
/ 08 января 2019

Я бы хотел, чтобы вы помогли создать скрипт для получения результатов и, при необходимости, обновить поле в моей таблице.

В моем приложении есть люди (таблица PERSON), которые создают REQUESTS (таблица REQUEST). Человек активен, когда он создал запрос в течение последних 3 лет. Я создал поле (ACTIVE - значение по умолчанию: 1) в таблице PERSON, чтобы узнать, активен ли этот человек.

Я создаю запрос для получения количества запросов для каждого человека (общее количество запросов, активный запрос, неактивный запрос):

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

Я хотел бы знать, возможно ли сделать это в том же сценарии? Следовательно, я мог знать, сколько обновлений было выполнено, не удалось, ... за один запрос.

Заранее благодарим за помощь

1 Ответ

0 голосов
/ 08 января 2019

Требуется условие 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 во внешнем запросе не произойдет.

Если вы хотите установить 1 или 0 в зависимости от результата подзапроса:

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