使用子查询sql server 2008进行更新

时间:2014-04-27 05:36:43

标签: sql-server-2008-r2

有两个更新查询和第一个更新查询成功执行但第二个更新查询未执行并显示以下消息:

  

Msg 512,Level 16,State 1,Line 10
  子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。声明已经终止。

第一次更新查询:

update dbo.TblPrePostApproval 
set 
    dbo.TblPrePostApproval.PAApprovedDate = (select dbo.TblMasterInfo.AppRefDate 
                                             from dbo.TblMasterInfo 
                                             Where dbo.TblMasterInfo.Appid = dbo.TblPrePostApproval.Appid),
    dbo.TblPrePostApproval.PAApprovedTenor = '36',
    dbo.TblPrePostApproval.PAApprovedAmt = (select dbo.TblMasterInfo.AppReqeustAmt 
                                            from dbo.TblMasterInfo 
                                            where dbo.TblPrePostApproval.Appid = dbo.TblMasterInfo.AppID),  
    dbo.TblPrePostApproval.PADisbBr = (select dbo.TblMasterInfo.AppSourceBrName 
                                       from dbo.TblMasterInfo 
                                       where dbo.TblPrePostApproval.Appid = dbo.TblMasterInfo.AppID)

第二次更新查询

update dbo.TblPrePostApproval   
set 
   dbo.TblPrePostApproval.PAApprovedDate = (select dbo.TestPost.PADate 
                                            from dbo.TestPost 
                                            Where dbo.TestPost.Appid = dbo.TblPrePostApproval.Appid),
   dbo.TblPrePostApproval.PAApprovedTenor = (select dbo.TestPost.PATenor 
                                             from dbo.TestPost 
                                             Where dbo.TestPost.Appid = dbo.TblPrePostApproval.Appid),
   dbo.TblPrePostApproval.PAApprovedAmt = (select dbo.TestPost.PAAmt 
                                           from dbo.TestPost 
                                           where dbo.TestPost.Appid = dbo.TblPrePostApproval.AppID),    
   dbo.TblPrePostApproval.PADisbBr = (select dbo.TestPost.PABr 
                                      from dbo.TestPost 
                                      where dbo.TestPost.Appid = dbo.TblPrePostApproval.AppID)

我的问题在哪里?请任何人建议我。

2 个答案:

答案 0 :(得分:0)

你的一个子查询(我猜第10行)正在返回多行,所以它无法检查它是否等于任何东西,因为它是一个集合,而不是一个值。只需将查询更改为更具体。尝试将LIMIT 0, 1添加到子查询的末尾,或者在每个子查询中的TOP (1)之后添加SELECT

答案 1 :(得分:0)

为什么不使用JOIN进行更新?更容易阅读和理解!

查询#1:

UPDATE ppa
SET
    PAApprovedDate = info.AppRefDate,
    PAApprovedTenor = '36',
    PAApprovedAmt = info.AppReqeustAmt,
    PADisbBr = info.AppSourceBrName 
FROM
    dbo.TblPrePostApproval ppa
INNER JOIN 
    dbo.TblMasterInfo.TblMasterInfo info ON info.Appid = ppa.Appid

查询#2:

UPDATE ppa
SET
   PAApprovedDate = tp.PADate,
   PAApprovedTenor = tp.PATenor,
   PAApprovedAmt = tp.PAAmt,    
   PADisbBr = tp.PABr
FROM
    dbo.TblPrePostApproval ppa
INNER JOIN 
    dbo.TestPost tp ON tp.Appid = ppa.AppID