2008-11-14 21 views
17

Ich habe eine Master/Detail-Tabelle und möchte einige zusammenfassende Werte in der Master-Tabelle gegen die Detail-Tabelle aktualisieren. Ich weiß, ich kann sie wie folgt aktualisiert:Mehrere Werte in einer einzigen Anweisung aktualisieren

update MasterTbl set TotalX = (select sum(X) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 
update MasterTbl set TotalY = (select sum(Y) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 
update MasterTbl set TotalZ = (select sum(Z) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 

Aber, ich mag es in einer einzigen Anweisung tun, so etwas wie diese:

update MasterTbl set TotalX = sum(DetailTbl.X), TotalY = sum(DetailTbl.Y), TotalZ = sum(DetailTbl.Z) 
from DetailTbl 
where DetailTbl.MasterID = MasterTbl.ID group by MasterID 

aber das funktioniert nicht. Ich habe auch versucht, Versionen, die die "Gruppierung nach" -Klausel weglassen. Ich bin mir nicht sicher, ob ich gegen die Grenzen meiner speziellen Datenbank (Advantage) oder die Grenzen meines SQL stoße. Wahrscheinlich Letzteres. Kann jemand helfen?

Antwort

3

Warum machst du eine Gruppe mit einer Update-Anweisung? Sind Sie sicher, dass das nicht der Teil ist, der die Abfrage fehlschlägt? Versuchen Sie folgendes:

update 
    MasterTbl 
set 
    TotalX = Sum(DetailTbl.X), 
    TotalY = Sum(DetailTbl.Y), 
    TotalZ = Sum(DetailTbl.Z) 
from 
    DetailTbl 
where 
    DetailTbl.MasterID = MasterID 
+0

@Chris, das funktioniert auch nicht für mich. Wenn es für Sie funktioniert, stoße ich wahrscheinlich auf eine Einschränkung meiner speziellen Datenbank. – Kluge

+0

Ich habe jetzt meine ursprüngliche Frage geklärt, um zu zeigen, dass ich versucht habe, die "Group by" -Klausel wegzulassen. Vielen Dank! – Kluge

+0

Welchen Datenbankserver/welche Version verwenden Sie? Wenn du mein SQL sagst, meinst du "meine SQL-Kenntnisse" oder "mySQL, der Server"? – Chris

2

Haben Sie mit einer Unterabfrage für jedes Feld versucht:

UPDATE 
    MasterTbl 
SET 
    TotalX = (SELECT SUM(X) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID), 
    TotalY = (SELECT SUM(Y) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID), 
    TotalZ = (SELECT SUM(Z) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 
WHERE 
    .... 
+0

@Milen, Du hast Recht, das würde funktionieren. Allerdings nehme ich an, dass es nicht schneller als die drei Aussagen in meinem Beispiel wäre. Ich denke, ich sollte beide Wege versuchen und die Zeiten vergleichen. – Kluge

18

Try this:

Update MasterTbl Set 
    TotalX = Sum(D.X),  
    TotalY = Sum(D.Y),  
    TotalZ = Sum(D.Z) 
From MasterTbl M Join DetailTbl D 
    On D.MasterID = M.MasterID 

Je nachdem, welche Datenbank Sie verwenden, wenn das doesn 't arbeiten, dann versuchen Sie dies (dies ist nicht-Standard-SQL aber legal in SQL Server):

Update M Set 
    TotalX = Sum(D.X),  
    TotalY = Sum(D.Y),  
    TotalZ = Sum(D.Z) 
From MasterTbl M Join DetailTbl D 
    On D.MasterID = M.MasterID 
+0

Ich habe beides versucht Ihre Datenbank unterstützt nur SQL-92 mit einigen Erweiterungen. Welche Datenbank verwenden Sie, die den vorgeschlagenen Code unterstützt? – Kluge

+0

SQL Server unterstützt diese Syntax ... Wenn Ihre Datenbank dies nicht tut Unterstützen Sie dies, dann denke ich, dass Sie mit dem Multiple-Subquery-Ansatz festgefahren sind .. wie von Milen empfohlen –

+2

Dies ist kein legales SQL. Es gibt keine FROM-Klausel in einem Update. http://dev.mysql.com/ doc/refman/6.0/de/update.html –

2

Try this:

update MasterTbl M, 
     (select sum(X) as sX, 
       sum(Y) as sY, 
       sum(Z) as sZ, 
       MasterID 
     from DetailTbl 
     group by MasterID) A 
set 
    M.TotalX=A.sX, 
    M.TotalY=A.sY, 
    M.TotalZ=A.sZ 
where 
    M.ID=A.MasterID 
3

In Oracle wäre die Lösung:

UPDATE 
    MasterTbl 
SET 
    (TotalX,TotalY,TotalZ) = 
     (SELECT SUM(X),SUM(Y),SUM(Z) 
     from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 

Sie nicht wissen, ob Ihr System die gleiche ermöglicht.

+0

Meine Datenbank erlaubt das nicht, aber es ist schön zu sehen, welchen Ansatz andere Datenbankanbieter gewählt haben. – Kluge

0

Wenn Ihre Datenbank dies unterstützt, wird die Verkettung aller 3 Aktualisierungen in einer sql-Zeichenfolge bei Server-Round-Trips bei Abfrage über das LAN gespeichert. Wenn also nichts anderes funktioniert, könnte dies eine leichte Verbesserung bedeuten. Das typische 'Multi-Statement Delimiter' ist das Semikolon, z. B .:

'update x....;update y...;update...z' 
Verwandte Themen