SQL Server更新设置情况

时间:2018-11-09 10:56:02

标签: sql-server

我想使用[Recipient on contract]和某些[DB].[dbo].[Check_Result]条件来填充表update的列case when。 该错误似乎位于Set [Recipient on contract] =语句附近。

这是运行查询时收到的以下错误消息:
“子查询返回的值不止1个。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。”

我特别引起您注意查询的SET [column] =多行部分。

 --add an empty column
Alter table [DB].[dbo].[Check_Result]
add [Recipient on contract] varchar(200)

--Check_rules
update [DB].[dbo].[Check_Result]
    Set [Recipient on contract] =
    case when 'Personne morale' in(select [Bénéficiaire]
                                   from [DB_SANOFI].[dbo].All_Contracts$) then 
        case when (select [Organisme]
                   from [DB_SANOFI].[dbo].All_Contracts$) is not null then (select substring(Organisme, 1 ,PATINDEX('%(%', Organisme)-1) from All_Contracts$)
             else (select substring([Professionnel de santé], 1 ,PATINDEX('%/%', [Professionnel de santé])-1) from All_Contracts$)
             end
    else
        case when (select [Professionnel de santé]
                   from [DB_SANOFI].[dbo].All_Contracts$) is not null then (select substring([Professionnel de santé], 1 ,PATINDEX('%/%', [Professionnel de santé])-1) from All_Contracts$)
             else (select substring(Organisme, 1 ,PATINDEX('%(%', Organisme)-1) from All_Contracts$)
             end
    end;

2 个答案:

答案 0 :(得分:0)

您提供的错误消息说明了您所遇到的确切问题。您用于选择要放入[Recipient on contract]的值的查询返回多个值。您需要缩小子查询的范围,以仅返回一条记录。

它可能是任何一个子查询:

select substring(Organisme, 1 ,PATINDEX('%(%', Organisme)-1) from All_Contracts$

select substring([Professionnel de santé], 1 ,PATINDEX('%/%', [Professionnel de santé])-1) from All_Contracts$

select substring([Professionnel de santé], 1 ,PATINDEX('%/%', [Professionnel de santé])-1) from All_Contracts$

select substring(Organisme, 1 ,PATINDEX('%(%', Organisme)-1) from All_Contracts$

尝试运行其中的每一个,并找出哪个(可能是所有这些,因为您没有通过WHERE子句限制它们)会给您带来不止一个的结果。

答案 1 :(得分:0)

这不是答案,但可以帮助您解决自己的问题。让我们首先将查询简化为一种情况:

update [DB].[dbo].[Check_Result]
    Set [Recipient on contract] =
        (select substring([Professionnel de santé], 1 ,
           PATINDEX('%/%', [Professionnel de santé])-1) 
           from All_Contracts$)

现在仔细看。子查询将在All_Contracts $中返回EVERY ROW的值。您没有将该子查询与外部(更新)语句中的表相关联,因此引擎很乐意生成子查询的结果集,然后尝试将许多(即使只有2个)行分配给Check_Result的每一行中的列表。它无法做到这一点,所以您会遇到错误。

因此关键是要关联所有这些子查询。为了正确地做到这一点,一个人需要了解您所引用的表之间的关系(也许您偶然或错误地遗漏了其他表)。如果您可以提供该信息,则可能会有人提供帮助。

请注意,这是相当复杂的sql-对于初学者来说肯定不是什么。您是否考虑过向大型咨询公司寻求当地资源的帮助?

旁注。您正在引用不同数据库中的表。对 all 表不使用3个零件名称,会增加错误的风险。您至少有2个对All_Contracts $的引用,这些引用既没有数据库也没有架构。另外,您的许多情况在逻辑上似乎都是不正确的。它们不会产生语法或运行时错误,但可能不会产生正确的结果。再一次-如果您可以从同事那里获得帮助,您将受益匪浅。