首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化更新语句

简化更新语句
EN

Stack Overflow用户
提问于 2013-08-22 15:05:42
回答 3查看 59关注 0票数 1

我有一份休整更新声明:

代码语言:javascript
复制
update tmp set 
tmp.Anzahl=(select sum(a.BNANZ) from PAYMASTER_Journal a where a.BNARTID=tmp.ArtikelAutoID), 
tmp.Betrag=(select sum(a.BNBETR) from PAYMASTER_Journal a where a.BNARTID=tmp.ArtikelAutoID), 
tmp.Rabatt=(select sum(a.BNRMRBETR) from PAYMASTER_Journal a where a.BNARTID=tmp.ArtikelAutoID) 
from ##tmp1 tmp 

这样,对于##tmp1中的每条记录,都执行了3个子查询。##tmp1包含10,000条记录,->总共包含30,000个子查询。

因为每个子查询都从PAYMASTER_Journal中选择相同的记录,所以我正在搜索一种方法,通过在##tmp1中每个记录只执行一个子查询来更新##tmp1。

希望有人能帮我解决这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-22 15:13:40

使用LEFT JOIN尝试如下

代码语言:javascript
复制
update tmp set 
tmp.Anzahl=BNANZ_accumulated, 
tmp.Betrag=BNBETR_accumulated, 
tmp.Rabatt=BNRMRBETR_accumulated
from ##tmp1 tmp 
LEFT JOIN  ( SELECT BNARTID, 
                SUM(BNANZ) AS BNANZ_accumulated, 
                SUM(BNBETR) AS BNBETR_accumulated,
                SUM(BNRMRBETR) AS BNRMRBETR_accumulated 
                FROM PAYMASTER_Journal 
                WHERE (ARTIKELAUSWAHL=0x30 AND BLBONSTO=0x30 AND BLZESTO=0x30 AND 
                      STORNO=0x30 AND 
                      BDDAT BETWEEN '20120301' AND '20130821' AND 
                      AdressID='d68e4d8f-e60e-4482-9730-76076948df43' AND
                      BNFIL=5 AND 
                      ISNULL(Preisliste, 'VK-Preisliste') =  'VK-Preisliste' AND 
                      BNARTID=tmp.ArtikelAutoID) 

                GROUP BY BNARTID) a ON a.BNARTID=tmp.ArtikelAutoID

当给定的NULLPAYMASTER_Journal中没有行时,这将留给您##tmp1.ArtikelAutoID。

如果您不想碰它们,请将LEFT JOIN更改为INNER JOIN

票数 1
EN

Stack Overflow用户

发布于 2013-08-22 15:13:08

我将使用MERGE声明:

代码语言:javascript
复制
merge ##tmp1
using   (select 
            BNARTID
            ,sum(BNANZ) as BNANZ
            ,sum(BNBETR) as BNBETR
            ,sum(BNRMRBETR) as BNRMRBETR
        from 
            PAYMASTER_Journal
        group by
            BNARTID
        ) as upd
on tmp.ArtikelAutoID = upd.BNARTID
when matched then update set Anzahl=BNANZ, Betrag=BNBETR, Rabatt=BNRMRBETR;
票数 0
EN

Stack Overflow用户

发布于 2013-08-22 15:21:21

您可以使用以下单个子查询来完成它。

代码语言:javascript
复制
UPDATE  tmp T 
INNER JOIN
        (SELECT a.BNARTID
                ,sum(a.BNANZ) as BANAZ_SUM
                ,sum(a.BNBETR) as BNBETR_SUM
                ,sum(a.BNRMRBETR) as BNRMRBETR_SUM
        FROM    PAYMASTER_Journal a
        WHERE   a.BNARTID = tmp.ArtikelAutoID
        GROUP BY
                a.BNARTID
        ) SQ
ON      SQ.BNARTID = tmp.ArtikelAutoID       
SET     tmp.Anzahl = SQ.BANAZ_SUM
        ,tmp.Betrag = SQ.BNBETR_SUM
        ,tmp.Rabatt = SQ.BNRMRBETR_SUM
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18384237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档