Sql server 2008 试图在SQL存储过程中将多个UPDATE语句合并为一个语句
我在一个存储过程中有多个update语句(如下所示) 问题是,由于存在性能问题(执行存储过程需要更长的时间),我正在尝试将它们合并到一个UPDATE语句中。我尝试将列(如PONUMBER、VENDORID等)放在一个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 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
。