PDA

View Full Version : UPDATE / SELECT



linguin
07-12-04, 07:18
Hallo zusammen,

habe hier zwei Tabellen.

1. Tabelle "Teilepreise"
Feld 1: Teilenummer = ETNR
Feld 2: Firma = ETFIRMA
Feld 3: EK-Netto = ETEKNE

2. Tabelle "Teilebestand"
Feld 1: Teilenummer = BETNR
Feld 2: Firma = BEFIRMA
Feld 3: Durchschn. EK = BEDUEK

Nun möchte ich durch ein UPDATE/SELECT Statement
das feld TEILEBESTAND.BEDUEK durch den Wert in TEILEPREISE.ETEKNE updaten !!

Aber nur wenn
TEILEBESTAND.BETNR = TEILEPREISE.ETNR
und
TEILEBESTAND.BEFIRMA = TEILEPREISE.ETFIRMA!!

Ist dies möglich ??

Gruß

Christian

JonnyRico
07-12-04, 08:54
Hi Christian,


UPDATE XXX/teilebestand Set BEDUEK =
(SELECT ETEKNE FROM XXX/TEILEPREISE INNER JOIN XXX/TEILEBESTAND ON
TEILEBESTAND.BETNR = TEILEPREISE.ETNR AND
TEILEBESTAND.BEFIRMA = TEILEPREISE.ETFIRMA)


sollte das machen was du gerne hättest.

Gruß

Sascha

Fuerchau
07-12-04, 13:27
@Jonny

Der Update muss noch um eine Where-Klausel ergänzt werden, wenn der Select ggf. keine Werte liefert und NULL in das Zielfeld nicht gesetzt werden darf:

where betnr in (select etnr from teilepreise)

linguin
07-12-04, 15:02
DANKE ERSTMAL.

funktioniert jedoch nicht !!

Meldung:

Die Ergebnistabelle einer Anweisung SELECT INTO, einer Unterabfrage oder einer Unterauswahl einer Anweisung SET enthält mehr als eine Zeile. Es handelt sich um Fehlerart 2. Bei Fehlerart 1 wurde von einer Anweisung SELECT INTO versucht, mehr als eine Zeile zurückzugeben.

anbei mein SQL

UPDATE TABELLE/RPBFREP SET TBEKDU =
(
SELECT TPEKNE FROM TABELLE/RPATREP
INNER JOIN
TABELLE/RPBFREP
ON
RPBFREP.TBTNR = RPATREP.TPTNR
AND
RPBFREP.TBFACD = RPATREP.TPFACD
WHERE
TBFACD='40'
AND
TBFICD='06'
)
WHERE
TBTNR
IN
(SELECT TPTNR FROM RPATREP WHERE TPFACD = '40')

Fuerchau
07-12-04, 15:40
Das Ergebnis deines Subselect muss natürlich genau 1 Zeile zurückgeben, da ja SQL sonst nicht weiß, welcher Wert denn nun da rein soll.
Du musst also deine Where-Klausel des Subselect so genau angeben, dass tatsächlich nur 1 Satz ausgewählt wird, da der Update ja nur für den einen aktuellen Satz gilt.

linguin
07-12-04, 15:43
hab ich mir schon gedacht.

nur wie mach ich das ??

denke das das rein über ein SQl nicht geht !!

Da muss wahrscheinlich programmiert werden.

Oder ??


Das Ergebnis deines Subselect muss natürlich genau 1 Zeile zurückgeben, da ja SQL sonst nicht weiß, welcher Wert denn nun da rein soll.
Du musst also deine Where-Klausel des Subselect so genau angeben, dass tatsächlich nur 1 Satz ausgewählt wird, da der Update ja nur für den einen aktuellen Satz gilt.

Fuerchau
07-12-04, 16:19
Wenn du keine eindeutige Beziehung hast, musst du eine schaffen.
Noch muss nix programmiert werden.

Wie ist denn die Beziehung der Tabelle RPATREP zu RPBFREP um TBEKDU zu aktualisieren ?
Wenn es mehrere Sätze gibt, worin unterscheiden sie sich (z.B. Gültigkeits-Datum o.ä.) ?
Diese Beziehung musst du ggf. per weiterem Subselect und MAX oder MIN-Funktion aufnehmen.