0

假设我有一张名为 InsuranceMember 的表,其中包含保险计划的所有成员及其配偶。但是哦不!对于 CountryCD 为“Canada”且 PlanCD 为“99999”的配偶,此表中的 MemberNum(主键)均不正确!

但幸运的是,有一个名为 InsurancePlan 的表,其中包含配偶,并且这些配偶的 MemberNum(也是主键)都是正确的!

所以在这个假设中,我需要一个条件更新语句来设置 InsuranceMember.MemberNum = InsurancePlan.MemberNum where 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'        
;
4

2 回答 2

0

在这种情况下,使用 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

因此,您可能需要在子选择中使用 MAX(pln.MemberNum) 或 DISTINCT,以确保为 PRD.InsuranceMember 中的每个选定行最多找到一行

于 2019-12-10T11:32:41.683 回答
0

尝试将 a 添加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'        
;
于 2019-12-09T19:26:49.520 回答