Delphi-PRAXiS

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 :-)

microtronx 29. Aug 2006 18:33

Re: SQL Update ... mache ich was falsch?
 
[quote="Jelly"]
Zitat:

Zitat von microtronx
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 :-)

Der
SQL-Code:
select EINZELKOSTEN.KOSTEN from EINZELKOSTEN where ART=1 and EINZELKOSTEN.AUFTRAGSNUMMER=GESAMTKOSTEN.AUFTRAGSNUMMER
darf nur einen Datensatz bringen weil für jede Auftragsnummer in Gesamtkosten auch in den Einzelkosten nur ein Eintrag für z.B. ART=1 existiert.

Ausser ich habe bei dem
SQL-Code:
EINZELKOSTEN.AUFTRAGSNUMMER=GESAMTKOSTEN.AUFTRAGSNUMMER
etwas falsch verstanden. Ich dachte, das läuft für jeden Datensatz in Gesamtkosten durch und holt sich aus den Einzelkosten jeweils den Wert für Abhol (gleiche Auftragsnummer mit der Art=1).

Irgendwie habe ich gerade eine Denkblokade, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr.

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