ora-01427批量更新表的时候提示单行子查询返回多个行

这是刚开始的更新语句:根据AMCARD表的ACCTCOMPID和ACCTDEPID字段关联LSBMZD表的LSBMZD_DWBH和LSBMZD_BMBH,得到相对于的LSBMZD_ID,然后根据这个LSBMZD_ID列匹配HRORGINFO表的MAPPINGORG字段,最终得到HRORGINFO表的NM字段,将AMCARD的USEDEPTID字段批量更新为NM字段

UPDATE AMCARD SET USEDEPTID=(
SELECT NM FROM HRORGINFO WHERE MAPPINGORG=(
SELECT LSBMZD_ID FROM LSBMZD WHERE LSBMZD_DWBH=ACCTCOMPID AND LSBMZD_BMBH=ACCTDEPTID
)
)

执行之后得到错误提示:

ora-01427批量更新表的时候提示单行子查询返回多个行_第1张图片

然后根据更新语句写出查询语句

SELECT AMID,NM,ACCTCOMPID,ACCTDEPTID,LSBMZD_ID,MAPPINGORG
 FROM AMCARD,LSBMZD,HRORGINFO 
 WHERE USEDEPTID IS NULL
 AND LSBMZD_DWBH=ACCTCOMPID
 AND LSBMZD_BMBH=ACCTDEPTID
 AND LSBMZD_ID=MAPPINGORG

得出查询结果:

ora-01427批量更新表的时候提示单行子查询返回多个行_第2张图片

很容易看出NM字段是大量重复值组成的,所以才会提示单行子查询返回多个行。

我的解决办法是根据唯一的ID列形成一一对应再执行更新,保证每一行只有一条记录就可以了。

要更新的AMCARD表中AMID是唯一的,因此我把AMID加入到查询结果中作为临时表t,再根据AMID=t.AMID就可以实现单行更新了,执行语句如下:

UPDATE AMCARD SET USEDEPTID=(
 SELECT NM FROM(SELECT AMID AS A,NM
 FROM AMCARD,LSBMZD,HRORGINFO 
 WHERE USEDEPTID IS NULL
 AND LSBMZD_DWBH=ACCTCOMPID
 AND LSBMZD_BMBH=ACCTDEPTID
 AND LSBMZD_ID=MAPPINGORG)T
 WHERE AMID=T.A
 )
 WHERE USEDEPTID IS NULL
这样就可以执行了。

你可能感兴趣的:(oracle)