Sql server 2008 试图在SQL存储过程中将多个UPDATE语句合并为一个语句

Sql server 2008 试图在SQL存储过程中将多个UPDATE语句合并为一个语句,sql-server-2008,stored-procedures,sql-update,left-join,Sql Server 2008,Stored Procedures,Sql Update,Left Join,我在一个存储过程中有多个update语句(如下所示) 问题是,由于存在性能问题(执行存储过程需要更长的时间),我正在尝试将它们合并到一个UPDATE语句中。我尝试将列(如PONUMBER、VENDORID等)放在一个update语句中,但它抛出了错误 请建议 UPDATE rptMaster SET PONUMBER = (select top 1 poMaster.PONUMBER from poMaster where poMaster.ITEMNMBR =rptMaster.I

我在一个存储过程中有多个update语句(如下所示)

问题是,由于存在性能问题(执行存储过程需要更长的时间),我正在尝试将它们合并到一个UPDATE语句中。我尝试将列(如PONUMBER、VENDORID等)放在一个update语句中,但它抛出了错误

请建议

     UPDATE rptMaster SET  PONUMBER = (select top 1 poMaster.PONUMBER from poMaster where poMaster.ITEMNMBR =rptMaster.ITEMNMBR and 
        poMaster.UnCommited > 0)

    UPDATE rptMaster SET  VENDORID = (select top 1 poMaster.VENDORID from poMaster where poMaster.ITEMNMBR =rptMaster.ITEMNMBR and 
    poMaster.UnCommited > 0)

    UPDATE rptMaster SET  DUEDATE = (select top 1 poMaster.REQDATE from poMaster where poMaster.ITEMNMBR =rptMaster.ITEMNMBR and 
    poMaster.UnCommited > 0)

    UPDATE rptMaster SET  POQTYORDER = (select top 1 (poMaster.QTYORDER / rptMaster.UOMQTY) from poMaster where poMaster.ITEMNMBR =rptMaster.ITEMNMBR and 
    poMaster.UnCommited > 0)

我的类似于波尔克杜兰的:

 WITH PO AS (
     SELECT  PONUMBER
        ,    VENDORID
        ,    REQDATE
        ,    QTYORDER
        ,    ITEMNMBR
        ,    ROW_NUMBER() OVER (PARTITION BY ITEMNMBR ORDER BY ??) as RN
     FROM    poMaster
     WHERE   UnCommited > 0
    )
 UPDATE rptMaster 
 SET  PONUMBER = po.PONUMBER
 ,    VENDORID = po.VENDORID 
 ,    DUEDATE = po.REQDATE
 ,    POQTYORDER = po.QTYORDER / rptMaster.UOMQTY
 FROM rptMaster
     JOIN PO
          ON  PO.ITEMNMBR = rptMaster.ITEMNMBR 
          and PO.RN = 1
我使用公共表表达式(CTE)为每个
poMaster
记录分配一个行号,每个
ITEMNMBR
值的记录分别编号。这使我们能够为我们的
加入
中的每个
ITEMNBR
选择第一条记录,稍后类似于您在子查询中使用Top 1的方式


但是请注意:因为您没有指明如何在查询中选择前1条记录,所以我不得不在CTE中保留ORDERBY子句未指定。(我把
??
作为占位符放进去。)您需要指定一个或多个排序字段来代替
??
,以便它知道如何对记录进行排序和编号

您可以使用join子句进行更新:

update rpt
set
    PONUMBER = po.PONUMBER,
    VENDORID = po.VENDORID,
    DUEDATE = po.REQDATE,
    POQTYORDER = (po.QTYORDER / rpt.UOMQTY)
from rptMaster rpt
inner join poMaster po
    on po.ITEMNMBR = rpt.ITEMNMBR
where po.UnCommited > 0

我现在没有办法测试它,但这可能会起作用。

但是最重要的1项要求呢?OP可能关心哪些poMaster值用于更新
rptMaster