用于获取结果并同时更新 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
不会发生。
如果要根据子查询的结果设置为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
我需要你的帮助来创建一个脚本来获取结果,同时在必要时更新我的 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
不会发生。
如果要根据子查询的结果设置为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