[英]Updating multiple rows dynamically according to a value in another table oracle sql
表 1:员工 ID(例如:100000)| 状态 ((A)active/(I)nactive)
表 2:组(例如:'ABC')| emplid(例如:100000)| has_documents((Y)es/(N)o)
我正在尝试更新一个表,以便将每个活动的员工设置为 has_document = 'Y' 的状态,并将每个不活动的员工设置为 has_documents = 'N'。 一个员工可以在多个组中,如果他的状态是活跃的,那么在包含其员工 ID 的每一行上都必须处于“Y”状态
这是我目前的查询:
UPDATE table2 t2 SET has_documents =
(SELECT (CASE WHEN(
SELECT t1.HR_STATUS
FROM table1 t1
WHERE t1.EMPLID = t2.EMPLID ) = 'A' THEN 'Y' ELSE 'N' END) FROM DUAL);
它返回以下错误:单行子查询返回多于一行
我也试过这个查询,它返回了同样的错误:
UPDATE SYSADM.PS_RH_EE_LITIGATN P
SET RH_RR_DOC = (SELECT
(CASE WHEN
(SELECT J.HR_STATUS FROM PS_JOB_CURR_VW J
JOIN SYSADM.PS_RH_EE_LITIGATN L
ON J.EMPLID = L.EMPLID WHERE J.EMPLID = P.EMPLID)
= 'A' THEN 'Y' ELSE 'N' END) FROM DUAL);
示例数据:
table 1: table2:
empli_id | status group | empli_id | has_docs
100000 | A 'ABC' | 100002 | null
100001 | I 'XYZ' | 100002 | null
100002 | A 'ABC' | 100001 | null
100003 | A 'ABC' | 100003 | null
100004 | I 'XYZ' | 100004 | null
预期结果:
table 1: table2:
empli_id |status group | empli_id | has_docs
100000 | A 'ABC' | 100002 | Y
100001 | I 'XYZ' | 100002 | Y
100002 | A 'ABC' | 100001 | N
100003 | A 'ABC' | 100003 | Y
100004 | I 'XYZ' | 100004 | N
您可以使用合并语句如下:
Merge into table2 t2
Using (select * from table1) t1
On (t1.empli_id = t2.empli_id)
When matched then
Update set t2.has_document = decode(t1.status, 'A', 'Y', 'N')
干杯!!
员工可能分为两组,因此请使用条件聚合并计算非活动行。 使用在这样准备的数据merge
声明和一套has_docs
到Y
如果cnt_inactive为0, N
否则。
merge into table2 tgt
using (select empli_id, count(case status when 'I' then 1 end) cnt_inactive
from table1 group by empli_id) src
on (tgt.empli_id = src.empli_id)
when matched then update set
has_docs = case cnt_inactive when 0 then 'Y' else 'N' end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.