Seite 1 von 1

[gelöst] SQL-Code optimieren

Verfasst: Sa, 08.04.2023 11:40
von hk3003
Hallo Forum,
ich bin mir nicht sicher ob ich für folgenden SQL-Code die optimale Schreibweise gefunden habe?
lg heinz

Code: Alles auswählen

UPDATE "T_Stamm" SET "VTagKurs" = "AktKurs", "AktKurs" = (SELECT "AktKurs" FROM "T_Kurse" WHERE "T_Kurse"."ISIN" = "T_Stamm"."ISIN");  UPDATE "T_Stamm" SET "H_Kurs"  = "AktKurs" WHERE "AktKurs" > "H_Kurs"; UPDATE "T_Stamm" SET  "T_Kurs"  = "AktKurs" WHERE "AktKurs" < "T_Kurs" ;

Re: SQL-Code optimieren

Verfasst: Sa, 08.04.2023 15:34
von RobertG
Hallo Heinz,

zuerst einmal: Das sind 3 verschiedene Befehle. Ich liste das hier einmal neu.

Code: Alles auswählen

UPDATE "T_Stamm" SET 
"VTagKurs" = "AktKurs", 
"AktKurs" = (SELECT "AktKurs" FROM "T_Kurse" WHERE "T_Kurse"."ISIN" = "T_Stamm"."ISIN"); 

UPDATE "T_Stamm" SET "H_Kurs" = "AktKurs" WHERE "AktKurs" > "H_Kurs";

UPDATE "T_Stamm" SET "T_Kurs" = "AktKurs" WHERE "AktKurs" < "T_Kurs";
Die Unterabfrage im ersten Code wird ein Problem sein. Du hast für die Tabelle der äußeren Abfrage kein Alias gesetzt. Dann kann die Unterabfrage nicht auf die äußere Abfrage zugreifen. Also ist dort "T_Stamm" unbekannt. Vielleicht meinst Du:

Code: Alles auswählen

UPDATE "T_Stamm" AS "a" SET 
"VTagKurs" = "AktKurs", 
"AktKurs" = (SELECT "AktKurs" FROM "T_Kurse" WHERE "T_Kurse"."ISIN" = "a"."ISIN"); 
Und schon taucht das nächste Problem auf: Du weist "VTagKurs" einen Wert "AktKurs" zu, den Du gleichzeitig ändern willst. Vielleicht meinst Du ja

Code: Alles auswählen

UPDATE "T_Stamm" AS "a" SET 
"VTagKurs" = (SELECT "AktKurs" FROM "T_Kurse" WHERE "T_Kurse"."ISIN" = "a"."ISIN"), 
"AktKurs" = (SELECT "AktKurs" FROM "T_Kurse" WHERE "T_Kurse"."ISIN" = "a"."ISIN"); 
Oder Du willst erst die eine Änderung durchführen und "AktKurs" nachher ändern. Dann haben "VTagKurs" und "AktKurs" gegebenenfalls wieder unterschiedliche Werte:

Code: Alles auswählen

UPDATE "T_Stamm" SET "VTagKurs" = "AktKurs"; 

UPDATE "T_Stamm" AS "a" SET 
"AktKurs" = (SELECT "AktKurs" FROM "T_Kurse" WHERE "T_Kurse"."ISIN" = "a"."ISIN"); 
Gruß

Robert

Re: SQL-Code optimieren

Verfasst: Sa, 08.04.2023 16:51
von hk3003
Hallo Robert,
ja, die letzte Version ist die, die ich möchte. Erst "VTagKurs" = "AktKurs" dann "AktKurs" von "T_Kurse" updaten.
Dann sehen meine Befehle wie folgt aus:

Code: Alles auswählen

UPDATE "T_Stamm"  SET "VTagKurs" = "AktKurs"; 

UPDATE "T_Stamm" AS "a" SET 
"AktKurs" = (SELECT "AktKurs" FROM "T_Kurse" WHERE "T_Kurse"."ISIN" = "a"."ISIN"); 

UPDATE "T_Stamm" SET "H_Kurs" = "AktKurs" WHERE "AktKurs" > "H_Kurs";

UPDATE "T_Stamm" SET "T_Kurs" = "AktKurs" WHERE "AktKurs" < "T_Kurs";
Zu meinem besseren Verständnis:
- Wird für jedes UPDATE T_Stamm 1 mal durchlaufen - also 4 mal gesamt?
- das Alias verstehe ich nicht ganz
- meine ursprüngliche Variante hat aber sehr gut funktioniert,
lg heinz

Re: SQL-Code optimieren

Verfasst: Sa, 08.04.2023 18:51
von RobertG
Ja, für jedes Update wird die ganze Tabelle einmal durchlaufen.
Wenn Dein bisheriges Vorgehen geklappt hat, dann kannst Du natürlich die vorhergehenden Abfragen nutzen. Ich weiß ja nicht, was da an Tabellen hinter steckt.
Bei der Unterabfrage hätte ich aber gesagt: Das kann nicht funktionieren.

Code: Alles auswählen

(SELECT "AktKurs" FROM "T_Kurse" WHERE "T_Kurse"."ISIN" = "T_Stamm"."ISIN")
In der Unterabfrage steht keine Tabelle "T_Stamm".
Soll eine Unterabfrage auf den aktuellen Datensatz einer äußeren Abfrage (oder wie hier eines Updates) zugreifen, so muss die äußere Abfrage mit einem Alias versehen werden ("T_Stamm" AS "a"). Sonst weiß die Unterabfrage nicht, zu welchem "ISIN" denn der Datensatz geholt werden soll.

Re: SQL-Code optimieren

Verfasst: Sa, 08.04.2023 20:48
von hk3003
Danke Robert,
jetzt ist mir auch das Alias klar. Warum es auch ohne funktioniert hat, ist mir schleierhaft.
lg heinz