Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Update ... mache ich was falsch? (https://www.delphipraxis.net/76012-sql-update-mache-ich-falsch.html)

microtronx 28. Aug 2006 18:35

Datenbank: Firebird • Version: 1.5.3.x • Zugriff über: Nativ über UIB Komponenten

SQL Update ... mache ich was falsch?
 
Hallo,

kann es sein, dass ich an folgendem SQL-Script was falsch mache?

SQL-Code:
update GESAMTKOSTEN set ABHOL  = (select EINZELKOSTEN.KOSTEN from EINZELKOSTEN where ART=1 and EINZELKOSTEN.AUFTRAGSNUMMER=GESAMTKOSTEN.AUFTRAGSNUMMER);
update GESAMTKOSTEN set ZUSTELL = (select EINZELKOSTEN.KOSTEN from EINZELKOSTEN where ART=2 and EINZELKOSTEN.AUFTRAGSNUMMER=GESAMTKOSTEN.AUFTRAGSNUMMER);
update GESAMTKOSTEN set PORTO  = (select EINZELKOSTEN.KOSTEN from EINZELKOSTEN where ART=3 and EINZELKOSTEN.AUFTRAGSNUMMER=GESAMTKOSTEN.AUFTRAGSNUMMER);
Hintergrund:

In der EINZELKOSTEN Tabelle sind pro Auftrag mehrere Datensätze. Anhand von "ART" wird unterschieden, was das für Kosten sind.
In der GESAMTKOSTEN Tabelle gibt es pro Auftrag einen Datensatz aber für jede ART eine SPALTE.
(Die Tabellen / Namen sind erfunden ... aber das Prinzip ist gleich)

Einzelkosten hat ca 150.000 Datensätze. Die Gesamtkosten ca 50.000.

Wenn ich nun das o.g. Script starte, geht die Prozessorlast auf 75 bis 99% und auch nach 1 Stunde kein Ergebnis.

Eigentlich müsste es doch eine einfachere Möglichkeit geben, oder?

Kann mir einer einen Tip geben?

mkinzler 28. Aug 2006 18:43

Re: SQL Update ... mache ich was falsch?
 
Da Gesamtkosten nur eine Zusammenfassung der Einzelkosten darstellt, umfasst sie ja redundaten Daten.
Ich würde das durch eine SP lösen, welche die Daten bei Bedarf bereitstellt als sie in einer Extra Tabelle zu halten.

Die Abfrage selber würde ich über die Aggregatsfunktion SUM machen.

microtronx 28. Aug 2006 18:53

Re: SQL Update ... mache ich was falsch?
 
Zitat:

Zitat von mkinzler
Da Gesamtkosten nur eine Zusammenfassung der Einzelkosten darstellt, umfasst sie ja redundaten Daten.
Ich würde das durch eine SP lösen, welche die Daten bei Bedarf bereitstellt als sie in einer Extra Tabelle zu halten.

Die Abfrage selber würde ich über die Aggregatsfunktion SUM machen.

Wie würdest Du die Abfrage mit SUM erstellen?

mkinzler 28. Aug 2006 18:56

Re: SQL Update ... mache ich was falsch?
 
Kann sein, daß ich die Struktur mißverstanden habe, aber ich würde es so machen:
SQL-Code:
select SUM(EINZELKOSTEN.KOSTEN) from EINZELKOSTEN GROUP BY ART and EINZELKOSTEN.AUFTRAGSNUMMER;

microtronx 28. Aug 2006 18:58

Re: SQL Update ... mache ich was falsch?
 
Zitat:

Zitat von mkinzler
Kann sein, daß ich die Struktur mißverstanden habe, aber ich würde es so machen:
SQL-Code:
select SUM(EINZELKOSTEN.KOSTEN) from EINZELKOSTEN GROUP BY ART and EINZELKOSTEN.AUFTRAGSNUMMER;

Na das hätte ich auch gemacht aber, hier der Aufbau von Gesamt

auftragsnummer INTEGER,
ABHOL double,
ZUSTELL double,
PORTO double

und hier der Aufbau von Einzel:

Primary-Index: LONGINT autoinc
auftragsnummer: integer,
art: integer
kosten:double

mkinzler 28. Aug 2006 19:08

Re: SQL Update ... mache ich was falsch?
 
Dan würde ich es in dieser Richtung versuchen:
SQL-Code:
select
    a.Auftragsnummer,
    SUM(a.KOSTEN) as abhol,
    SUM(b.KOSTEN) as zustell,
    SUM(c.KOSTEN) as porto
from
    EINZELKOSTEN a,EINZELKOSTEN b, EINZELKOSTEN c
where
    a.Art = 1,
    b.Art = 1,
    c.Art = 1 
GROUP BY AUFTRAGSNUMMER;

microtronx 28. Aug 2006 19:24

Re: SQL Update ... mache ich was falsch?
 
Zitat:

Zitat von mkinzler
SQL-Code:
select
    a.Auftragsnummer,
    SUM(a.KOSTEN) as abhol,
    SUM(b.KOSTEN) as zustell,
    SUM(c.KOSTEN) as porto
from
    EINZELKOSTEN a,EINZELKOSTEN b, EINZELKOSTEN c
where
    a.Art = 1,
    b.Art = 1,
    c.Art = 1 
GROUP BY AUFTRAGSNUMMER;

Wie würdest Du das als UPDATE machen? Ich muss das mal testen, ob das schneller ist als mein 1. Script. funktionieren tut das was ich am Anfang des Beitrages geschrieben habe, wenn ich das auf nur einpaar Aufträge begrenze schon ... nur bei allen Aufträgen legt das die Maschine lahm.

mkinzler 28. Aug 2006 19:27

Re: SQL Update ... mache ich was falsch?
 
Wie ich geschriebne habe, würde ich kein Update machen, da in der Gesamt-Tabelle das gleich stehen würde wie in der Abfrage.

omata 28. Aug 2006 19:46

Re: SQL Update ... mache ich was falsch?
 
wegen Nichtbeachtung gelöscht...

Jelly 28. Aug 2006 20:20

Re: SQL Update ... mache ich was falsch?
 
Zitat:

Zitat von microtronx
SQL-Code:
update GESAMTKOSTEN set ABHOL  = (select EINZELKOSTEN.KOSTEN from EINZELKOSTEN where ART=1 and EINZELKOSTEN.AUFTRAGSNUMMER=GESAMTKOSTEN.AUFTRAGSNUMMER);

und
Zitat:

Zitat von microtronx
Einzelkosten hat ca 150.000 Datensätze. Die Gesamtkosten ca 50.000.

Da geh ich davon aus, dass der Select-Part für sich allein definitiv mehr als einen Datensatz liefert...

Auf welchen Werd soll denn deiner Meinung nach in Gesamtkosten.Abhol gesetzt werden... Soll sich die Datenbank da einen aussuchen :gruebel:

Du siehst, auf was ich raus bin :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz