如何更新为 SET Table1.ColumnX = Table2.ColumnX with a where 子句



假设我有一个名为InsuranceMember的表,其中包含保险计划的所有成员及其配偶。但是哦不!对于国家CD为"加拿大"且PlanCD为"99999"的配偶,此表中的MemberNum(主键(都是不正确的!

但值得庆幸的是,有一个名为InsurancePlan的表格,其中包含配偶,这些配偶的MemberNum(也是主键(都是正确的!

因此,在这个假设中,我需要一个条件更新语句,该语句设置InsuranceMember.MemberNum = InsurancePlan.MemberNum,其中CountryCD = 'Canada' and PlanCD = '99999'

我如何编写查询来使其工作并更新每一行。

当我尝试编写此查询时,我总是收到此错误: -811 更新语句的 SET 子句中的嵌入 SELECT 语句或子选择的结果是包含多行的表,或者基本谓词的子查询的结果是多个值

作为SQL的初学者,这对我来说非常令人困惑,但我相信我所描述的情况是许多人已经处理过的情况。

编辑:这是我使用的生成该更新的代码示例:

UPDATE PRD.InsuranceMember mem
set mem.MemberNum = ( Select pln.MemberNum
from PRD.InsurancePlan pln
where mem.MemberNum <> pln.MemberNum
and   mem.MoneySource = pln.MoneySource
)
WHERE mem.MemberNum = (SELECT pln2.MemberNum FROM PRD.InsurancePlan pln2
WHERE mem.ClientCd = pln2.ClientCd
AND mem.PLanCd = pln2.PlanCd)
AND Mem.MoneySource='3' 
AND Mem.CountryCd = 'Canada'
AND Mem.PlanCd = '99999'        
;

尝试在每个子查询的末尾添加一个FETCH FIRST ROW ONLY,这将通知数据库这些表达式不会返回多个值。

UPDATE PRD.InsuranceMember mem
SET mem.MemberNum = ( SELECT pln.MemberNum
FROM PRD.InsurancePlan pln
WHERE mem.MemberNum <> pln.MemberNum
AND   mem.MoneySource = pln.MoneySource
FETCH FIRST ROW ONLY
)
WHERE mem.MemberNum = (SELECT pln2.MemberNum 
FROM PRD.InsurancePlan pln2
WHERE mem.ClientCd = pln2.ClientCd
AND mem.PLanCd = pln2.PlanCd
FETCH FIRST ROW ONLY
)
AND mem.MoneySource='3' 
AND mem.CountryCd = 'Canada'
AND mem.PlanCd = '99999'        
;

在这种情况下,使用 SELECT 的 UPDATE 会有所帮助,因为您可以只运行 SELECT 部分并确保子选择newMemberNum只返回一行

UPDATE (
SELECT
MemberNum
,   MoneySource
,   CountryCd
,   PlanCd
,   ( Select pln.MemberNum
from PRD.InsurancePlan pln
where mem.MemberNum <> pln.MemberNum
and   mem.MoneySource = pln.MoneySource
) AS NewMemberNum
FROM
PRD.InsuranceMember mem
)
SET MemberNum = NewMemberNum
WHERE
MoneySource='3' 
AND CountryCd = 'Canada'
AND PlanCd = '99999'        
AND MemberNum IS DISTINCT FROM NewMemberNum

所以你可能需要一个最大(PLN。MemberNum(或 DISTINCT 一些这样的子选择,以确保在 PRD 中为每个选定的行最多找到一行。保险会员

最新更新