1

次の update-statement があります。

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 のレコードごとに 1 つのサブクエリのみを実行して ##tmp1 を更新する方法を探しています。

誰かがこれについて私を助けてくれることを願っています。

4

3 に答える 3

1

これを使ってLEFT JOINみる

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行がない場合、これはあなたを残しますPAYMASTER_Journal

それらに触れたくない場合はLEFT JOININNER JOIN

于 2013-08-22T15:13:40.433 に答える
0

次のように、単一のサブクエリで実行できます。

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
于 2013-08-22T15:21:21.230 に答える
0

私はMERGE声明で行きます:

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;
于 2013-08-22T15:13:08.630 に答える