[gelöst] SQL-Code optimieren

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst] SQL-Code optimieren

Re: SQL-Code optimieren

von hk3003 » Sa, 08.04.2023 20:48

Danke Robert,
jetzt ist mir auch das Alias klar. Warum es auch ohne funktioniert hat, ist mir schleierhaft.
lg heinz

Re: SQL-Code optimieren

von RobertG » Sa, 08.04.2023 18:51

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

von hk3003 » Sa, 08.04.2023 16:51

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

von RobertG » Sa, 08.04.2023 15:34

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

[gelöst] SQL-Code optimieren

von hk3003 » Sa, 08.04.2023 11:40

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" ;

Nach oben