根据 DB2 V5R4M0 中的另一个 table 更新多个列

Update multiple columns based off another table in DB2 V5R4M0

我正在为 AS400 DB/2 table 编写更新语句。它需要使用来自另一个具有匹配字段的 table 的数据更新多行。我们的驱动版本显示为:05.04.0000OS/400V5R4M0

我无法确定要使用的正确语法。

这是我用来收集要使用的正确数据的基本 CTE:

with tablesql as
              (
                select *
                from TBL1CPY
              ),
     tableAS400 as 
              (
                select *
                from TBL1 
                where LDT = '20220104' AND US ='ADMIN'
               ),
     tableSQLFrmJoin as
              (
                select s.* 
                from tablesql s, tableAS400 a
                where s.prj = a.prj AND s.PN = a.PN AND s.IN = a.IN
              )

以下是我用 CTE 尝试过的一些不同的东西:

1)  update TBL1 t1
    set (STS) = ( select STS from  tableSQLFrmJoin ) t2
    where t1.prj = t2.prj AND t1.PN = t2.PN AND t1.IN = t2.IN 

*this throws the error: Error Source: IBMDA400 Command, Error Message: SQL0199: Keyword Update  not expected...* 

2) MERGE INTO TBL1 t1
   USING 
   (select * from tableSQLFrmJoin) t2
   on (t1.prj = t2.prj AND t1.PN = t2.PN AND t1.IN = t2.IN) 
   when matched then
   update SET STS = 'TST'

   *this throws the error: Error Source: IBMDA400 Command, Error Message: SQL0104: Token MERGE  not expected...* 

3) update tbl1 t1, tableSQLFrmJoin t2
   set t1.STS = 'tst'
   where t1.prj = t2.prj AND t1.PN = t2.PN AND t1.IN = t2.IN 

   *this throws the error: Error Source: IBMDA400 Command, Error Message: SQL0199: Keyword Update  not expected...* 
  

结果应使用 CTE“tableSQLFrmJoin”
中的数据更新 tbl1 中的匹配行 现在,为了让查询正常工作,我只是对设置的案例使用测试数据。

使用一个简单的, Select * from tableSQLFrmJoin 按预期工作。因此,当使用 select 语句时,所写的 CTE 是受支持的并且可以正常工作。

你需要这样的东西

update TBL1 t1
set STS = (select sts
           from TBL1CPY cp
           where cp.prj = t1.prj AND cp.PN = t1.PN AND cp.IN = t1.IN
           )
where LDT = '20220104' AND US ='ADMIN';

请注意,以上假定始终只有一个匹配行,或者如果没有匹配行,则 STS 可以为空。

如果没有匹配的行并且 STS 不能为空,那么您将需要

update TBL1 t1
set STS = (select sts
           from TBL1CPY cp
           where cp.prj = t1.prj AND cp.PN = t1.PN AND cp.IN = t1.IN
           )
where LDT = '20220104' AND US ='ADMIN'
  and exists (select 1
              from TBL1CPY cp
              where cp.prj = t1.prj AND cp.PN = t1.PN AND cp.IN = t1.IN
             );