db2 - 在不同的表上使用 select 更新批量行

Posted

技术标签:

【中文标题】db2 - 在不同的表上使用 select 更新批量行【英文标题】:db2 - Bulk rows update with select on different tables 【发布时间】:2021-01-20 08:21:00 【问题描述】:

我想根据以下条件为多行更新一列 - 我只想为这些行更新文件 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 )   

                                         

AUUSRTX 列或变量中不允许有 Null 值。

【问题讨论】:

你说的是“文件”。什么 Db2 平台和版本? 【参考方案1】:

试试这个:

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

注意事项:

    min 函数用于不从子选择返回多行。 如果子选择没有返回任何行,AUUSRTX 列值保持不变。

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

【讨论】:

以上是关于db2 - 在不同的表上使用 select 更新批量行的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有主键的表上按顺序更新表?

从存储过程结果集中在表上插入/更新数据

无法在类型化的表 DB2 上定义主键

db2 V9.1 死锁

触发器导致在视图中使用的表上插入后,如何进行 MYSQL 视图更新

在基于临时会话的表上创建索引后运行统计信息