【问题标题】:Updating multiple rows dynamically according to a value in another table oracle sql根据另一个表oracle sql中的值动态更新多行
【发布时间】:2019-12-09 15:43:56
【问题描述】:

表 1: 员工编号(例如:100000)|状态((A)活跃/(I)不活跃)

表 2: 组(例如:'ABC')|宽(例如: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

【问题讨论】:

  • 样本数据和期望的结果会有很大帮助。
  • 完成我添加了一个例子:)
  • 如果单个子查询返回多行,则表明 table1 中的 empid 不是唯一的。你能分享查询 select count(*),empli_id from table1 group by empli_id order by 2 desc 的输出吗

标签: sql oracle


【解决方案1】:

员工可能分为两组,因此请使用条件聚合并对非活动行进行计数。在merge 语句中使用这些准备好的数据,如果cnt_inactive 为0,则将has_docs 设置为Y,否则设置N

dbfiddle demo

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

【讨论】:

    【解决方案2】:

    您可以使用如下合并语句:

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

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多