根据 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
);
我正在为 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
);