[gelöst] SQL-Code optimieren

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

hk3003
**
Beiträge: 36
Registriert: Mo, 31.12.2007 14:19

[gelöst] SQL-Code optimieren

Beitrag 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" ;
Zuletzt geändert von hk3003 am Sa, 08.04.2023 20:50, insgesamt 1-mal geändert.
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL-Code optimieren

Beitrag 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
hk3003
**
Beiträge: 36
Registriert: Mo, 31.12.2007 14:19

Re: SQL-Code optimieren

Beitrag 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
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL-Code optimieren

Beitrag 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.
hk3003
**
Beiträge: 36
Registriert: Mo, 31.12.2007 14:19

Re: SQL-Code optimieren

Beitrag von hk3003 »

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