Sql 简化更新语句

Sql 简化更新语句,sql,sql-server-2008,sql-update,Sql,Sql Server 2008,Sql Update,我有一个休整的更新声明: 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.BNRMRBE

我有一个休整的更新声明:

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 
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;
这样,对于##tmp1中的每个记录,执行3个子查询##tmp1包含10000条记录->总计30000个子查询

因为每个子查询都从PAYMASTER#u Journal中选择相同的记录,所以我正在寻找一种方法来更新##tmp1,在##tmp1中每个记录只执行一个子查询


我希望,有人能在这方面帮助我。

我将使用
MERGE
语句:

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 
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;

我将使用
MERGE
语句:

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 
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;

使用
左连接
尝试此操作

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
当给定的tmp1.ArtikelAutoID的
出纳员日记帐
中没有行时,这将使您的
NULL


如果您不想触摸它们,请使用
左连接将
左连接更改为
内部连接

,然后尝试此操作

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
当给定的tmp1.ArtikelAutoID的
出纳员日记帐
中没有行时,这将使您的
NULL


如果您不想触碰它们,请将
左连接更改为
内部连接

您可以通过以下单个子查询来完成

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

您可以使用一个子查询来完成此操作,如下所示

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

还有一个问题:子选择的有效位置比我的示例中的要复杂得多。它是:(ARTIKELAUSWAHL=0x30,BLBONSTO=0x30,BLZESTO=0x30,STORNO=0x30,BDDAT>='20120301'和BDDAT@ThomasKehl类似于编辑后的回答?我想,
where
子句用于表
PAYMASTER\u Journal
是的。不,我想我明白了:由于tmp1和PAYMASTER\u Journal之间的相关性,需要group bye组用于获取两个表之间的关系,你说是和否是什么意思…我应该像(1=0)那样计算吗?我的意思是“我在哪里…”是,另一个不应该是“和否…”,而是:“现在,…”还有一个问题:子选择的有效位置比我的样本中的位置复杂得多。它是:(ARTIKELAUSWAHL=0x30,BLBONSTO=0x30,BLZESTO=0x30,STORNO=0x30,BDDAT>='20120301'和BDDAT@ThomasKehl类似于编辑后的回答?我想,
where
子句用于表
PAYMASTER\u Journal
是的。不,我想我明白了:由于tmp1和PAYMASTER\u Journal之间的相关性,需要group bye组是为了得到两个表之间的关系,你说是和否是什么意思…我应该像(1=0)那样计算吗?我的意思是“我在哪里…”是的,而另一个不应该是“和否…”,而是:“现在,…”