这是刚开始的更新语句:根据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
)
)
执行之后得到错误提示:
然后根据更新语句写出查询语句
SELECT AMID,NM,ACCTCOMPID,ACCTDEPTID,LSBMZD_ID,MAPPINGORGFROM AMCARD,LSBMZD,HRORGINFO WHERE USEDEPTID IS NULLAND LSBMZD_DWBH=ACCTCOMPIDAND LSBMZD_BMBH=ACCTDEPTIDAND LSBMZD_ID=MAPPINGORG
得出查询结果:
很容易看出NM字段是大量重复值组成的,所以才会提示单行子查询返回多个行。
我的解决办法是根据唯一的ID列形成一一对应再执行更新,保证每一行只有一条记录就可以了。
要更新的AMCARD表中AMID是唯一的,因此我把AMID加入到查询结果中作为临时表t,再根据AMID=t.AMID就可以实现单行更新了,执行语句如下:
UPDATE AMCARD SET USEDEPTID=(SELECT NM FROM(SELECT AMID AS A,NMFROM AMCARD,LSBMZD,HRORGINFO WHERE USEDEPTID IS NULLAND LSBMZD_DWBH=ACCTCOMPIDAND LSBMZD_BMBH=ACCTDEPTIDAND LSBMZD_ID=MAPPINGORG)TWHERE AMID=T.A)WHERE USEDEPTID IS NULL
这样就可以执行了。