Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL: JOIN und UPDATE (https://www.delphipraxis.net/131804-sql-join-und-update.html)

ts-d 31. Mär 2009 10:56

Datenbank: Paradox • Version: 1 • Zugriff über: DB-Explorer oder Delphi7-Programmierung

SQL: JOIN und UPDATE
 
Hallo,

in Access habe ich eine Aktualisierungsabfrage zusammengebastelt - in Delphi bzw. im SQL-Fenster des SQL-Explorers (Delphi 7) klappt das nicht:

UPDATE [Auftragpos Paradox] INNER JOIN [Z2_Rabatte pro Hauptposition] ON ([Auftragpos Paradox].pos_h = [Z2_Rabatte pro Hauptposition].pos_h) AND ([Auftragpos Paradox].Auftrnum = [Z2_Rabatte pro Hauptposition].Auftrnum) SET [Auftragpos Paradox].RABATTSATZ = [Z2_Rabatte pro Hauptposition].[RABATTSATZ];

Erklärung:
1. Tabelle heißt Auftragpos und hat mehr Datensätze als die 2. Tabelle Rabatte

Beide Tabellen haben das Feld "RABATTSATZ"

Nun sollen die Werte von Tabelle Rabatte in das identische Feld der Tabelle Auftragpos kopiert werden.

Bedingung: Auftragsnummer (Auftrnum) und Hauptposition (pos_h) sind identisch.



Ein Artikel ist unter "SQL: Update aus zweiter Liste" vorhanden.
Aber der löst das Problem nicht. Nach dem Lösungsvorschlag hieße meine Syntax:
UPDATE 'Auftragpos.db' as a LEFT OUTER JOIN 'Rabatte.db' as o ON a.pos_h = o.pos_h AND a.Auftrnum = o.Auftrnum SET a.RABATTSATZ = o.RABATTSATZ

Fehlermeldung des SQL-Explorers: Invalid use of keyword, Token: LEFT !?



Vielleicht kennt ja jemand noch einen einfacheren Weg, z. B. mit Batch-Move oder Masterfield.
Jedenfalls müssen die Werte am Schluss in der Tabelle Auftragpos verfügbar sein.


vg
Thomas

mkinzler 31. Mär 2009 11:51

Re: SQL: JOIN und UPDATE
 
Es fehlt das select. Versuch mal
SQL-Code:
UPDATE [Auftragpos Paradox] SELECT JOIN [Z2_Rabatte pro Hauptposition] ON ([Auftragpos Paradox].pos_h = [Z2_Rabatte pro Hauptposition].pos_h) AND ([Auftragpos Paradox].Auftrnum = [Z2_Rabatte pro Hauptposition].Auftrnum) SET [Auftragpos Paradox].RABATTSATZ = [Z2_Rabatte pro Hauptposition].[RABATTSATZ];

ts-d 31. Mär 2009 12:05

Re: SQL: JOIN und UPDATE
 
Bei einem UPDATE-Befehl brauche ich doch kein SELECT.

Auf den Delphi-Pages habe ich noch die Lösung gefunden:

update 'Auftragpos.db' a, 'Rabatte.db' o set a.RABATTSATZ = o.RABATTSATZ where a.pos_h = o.pos_h AND a.Auftrnum = o.Auftrnum

Aber da meldet der SQL-Explorer: Token ,
Er mag das KOmma zwischen den beiden Tabellen nicht.

joachimd 31. Mär 2009 12:16

Re: SQL: JOIN und UPDATE
 
Zitat:

Zitat von ts-d
Bei einem UPDATE-Befehl brauche ich doch kein SELECT.

Auf den Delphi-Pages habe ich noch die Lösung gefunden:

update 'Auftragpos.db' a, 'Rabatte.db' o set a.RABATTSATZ = o.RABATTSATZ where a.pos_h = o.pos_h AND a.Auftrnum = o.Auftrnum

Aber da meldet der SQL-Explorer: Token ,
Er mag das KOmma zwischen den beiden Tabellen nicht.

Du darfst auch nur eine Tabelle updaten. Von MS SQL gibt es auch die erweiterte Syntax mit UPDATE FROM (unterstützt u.a. auch vom ADS).
SQL-Code:
update a set F2=b.F2 FROM TabelleA a
  INNER JOIN TabelleB b ON a.F1=b.F1
bzw.
SQL-Code:
update TabelleA set F2=b.F2 FROM TabelleB b
  WHERE TabelleA.F1=b.F1
Diese sind aber nicht ANSI-konform und daher sehr spezifisch!
Lt ANSI müsste es in etwa so gehen:
SQL-Code:
update TabelleA set F2=(select F2 from TabelleB b where b.F1=TabelleA.F1)

Bernhard Geyer 31. Mär 2009 12:31

Re: SQL: JOIN und UPDATE
 
Diverse DBMS unterstützen solche Updates. Aber wie sprechen hier von Paradox und BDE. Es würde mich mehr als wundern wenn sowas hier unterstützt wird.

ts-d 31. Mär 2009 13:14

Re: SQL: JOIN und UPDATE
 
... meine ich auch fast,

bei den letzten Vorschlägen kommt nämlich die Fehlermeldung Fehler bei FROM
und "Single row subquery produced more than one row."

Gibt's denn eine andere Lösung für das Problem?

Bernhard Geyer 31. Mär 2009 13:23

Re: SQL: JOIN und UPDATE
 
Zitat:

Zitat von ts-d
Gibt's denn eine andere Lösung für das Problem?

Ja. "Händisches" Update. Lass dir alle Datensätze per SELECT geben und schreib dann einzelne Update-Statements oder geh mit einer TTable-Komponente und Find durch die Datensätze durch und aktualisiere sie so. Dauert zwar, aber bei so einer alten DB darf man froh sein das sie bei zu vielen aktionen nicht kaputt geht.

ts-d 31. Mär 2009 13:28

Re: SQL: JOIN und UPDATE
 
Danke - schön umständlich, aber immerhin eine Lösung.

vg
Thomas

joachimd 31. Mär 2009 15:21

Re: SQL: JOIN und UPDATE
 
Zitat:

Zitat von ts-d
"Single row subquery produced more than one row."

Du hast mindestens eine Dublette drin! Damit kann keiner umgehen, denn es ist nicht klar, welcher Datensatz als Quelle herhalten soll.

mschaefer 31. Mär 2009 17:01

Re: SQL: JOIN und UPDATE
 
Zitat:

Zitat von ts-d
Danke - schön umständlich, aber immerhin eine Lösung.

BDE - Paradox kann es definitiv nicht anders. // Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 Uhr.
Seite 1 von 3  1 23      

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