db2 - 使用不同表上的选择更新批量行

问题描述

我想根据以下条件更新多行的列 - 我只想为这些行更新文件 abhipsha/AUDUSERF 的列 AUUSRTX

WHERE AUDUSERF.AUUSRTP <> 'USR' and AUDUSERF.AUUSRTP <> 'usr'  

并且需要更新的值必须来自匹配用户 id 的 usrprffil 的 usrprffil.uptext 。两个表的用户id如下

usrprffil.upuprf = auduserf.auusrid 

有人可以帮助正确查询此要求吗。

我写了以下 3 个查询,但我收到错误为 -“SELECT 多于一行的结果”对于第一个和第二个查询 查询 1 -

update  abhipsha/auduserf
set AUUSRTX = (                
    SELECT usrprffil.uptext
    from usrprffil  inner join             
         abhipsha/auduserf                                            
    on upuprf =auusrid  WHERE AUDUSERF.AUUSRTP <> 'USR'            
    and auduserf.auusrtp <> 'usr'   and auusrid = usrprffil.upuprf)

查询 2 -

update abhipsha/auduserf set AUUSRTX =                             
   (SELECT uptext fROM usrprffil inner                               
     join abhipsha/auduserf 
    on usrprffil.UPUPRF = auduserf.AUUSRID 
     WHERE
       usrprffil.UPUPRF in (
          SELECT AUUSRID FROM abhipsha/auduserf
          WHERE   
          AUUSRTP <> 'USR' and AUUSRTP <> 'usr'
       ) 
   )

对于我得到的第三个查询 - 空值错误 查询 3 -

update abhipsha/auduserf 
set  auduserf.AUUSRTX = (
    select UPTEXT      
    from usrprffil   
    WHERE usrprffil.UPUPRF = auduserf.AUUSRID 
    and   usrprffil.UPUPRF    in                                               
       (SELECT AUUSRID FROM abhipsha/auduserf                               
        WHERE AUUSRTP <> 'USR' and   AUUSRTP <> 'usr') 
    and uptext <> ' ' and 
    uptext is not null )   

                                         

列或变量 AUSRTX 中不允许有空值。

解决方法

试试这个:

update  abhipsha/auduserf a
set AUUSRTX =
COALESCE
(
  (                
    SELECT min(u.uptext)
    from usrprffil u
    WHERE a.auusrid = u.upuprf
  ),AUUSRTX
)  
WHERE a.AUUSRTP NOT IN ('USR','usr')

注意事项:

  1. min 函数用于不从子选择返回多行。
  2. 如果子选择不返回任何行,则 AUUSRTX 列值保持原样。

当然,您可以根据自己的需要调整上述逻辑。