PDA

View Full Version : SQL mit Update + Join



Seiten : [1] 2

Harald.Wallukat
05-05-03, 10:45
Hallo geschätzte SQL-Spezies !
Wir möchten gerne Feld1 mit Feld2 in Datei A via SQL updaten, wobei das Feld2 gejoint aus Datei B stammt. Im MS Acces kein Problem. Auf der AS bin ich zu dusselig. Bitte um hilfreiche Hinweise.
Danke
Harald

Fuerchau
05-05-03, 11:57
update fileA
set feld1 = (select feld2 from fileb where filea.key = fileb.key)
where filea.key in (select fileb.key from fileb)

Die where-Bedingung ist dann erforderlich, wenn filea mehr Schlüssel als fileb enthält, da sonst der 1. Subselect einen NULL-Wert liefert, falls der Schlüssel in fileb nicht vorhanden ist.

Bei mehreren Schlüsselfeldern kann die jeweilige where-bedingung natürlich ergänzt werden.

Harald.Wallukat
05-05-03, 12:33
Vielen Dank !
Hat prima geklappt und der Fall wurde
in den Tipps+Tricks notiert.
Grüße
Harald Wallukat

KingofKning
29-11-13, 09:43
Hallo *all,

ich bräuchte mal einen Denkanstoß.
Ich habe wie der Vorredner auch eine Datei in der ich 3 Felder updaten will. Die Logik ist zwar klar, allein die Syntax bekomme ich gedanklich nicht hin.

Das ist die Ausgangssituation:

update x/ipdocim a set a.imbelj = 13,

a.imbeld = '20' !! substr(digits(akkdt2), 1, 2)
!! substr(digits(akkdt2), 3, 2) !! substr(digits(akkdt2), 5, 2),
a.imadrn = akkto

join xxx/ako01pf b on (a.imbeln = b.akanr and akkdt2 > 130101)
where (IMBELN > 148125 and IMBELN < 148129
and IMBELA = 'AS'
and IMBELJ <> 13)

Jetzt müßte ja das join in ein update a.imbeld = select ..... umgebaut werden.

Für Hinweise dankbar.

GG

malzusrex
29-11-13, 10:18
Hallo GG,

ohne das jetzt getestet zu haben, denke ich mal in etwa so


Update x/ipdocim a
Set(a.imbeld, a.imadrn ) =
(Select '20' concat SubStr(Digits(b.akkdt2), 1, 2)
concat SubStr(Digits(b.akkdt2), 3, 2)
concat SubStr(Digits(b.akkdt2), 5, 2),
akkto
from xxx/ako01pf b where a.imbeln = b.akanr and b.akkdt2 > 130101)
where imbeln between 148125 and 148129
and imbela = 'AS'
and imbelj <> 13
and imbeln in (Select akanr from xxx/ako01pf where akkdt2 > 130101)


Gruß
Ronald

KingofKning
29-11-13, 12:12
Danke,
das ist es. Hat jetzt nur noch ein paar Sekunden gedauert weil ich noch ein distinct unterbringen mußte.

KingofKning
02-12-13, 11:00
Tja leider doch nicht, ich weis nicht was er will, aber wenn ich das Statement loslasse, kommt er mir mit einem

Nachrichten-ID . . . . : SQL0407 Bewertung . . . . . . : 30
Nachrichtenart . . . . : Diagnose

Nachricht . . . : Nullwerte für Spalte oder Variable IMBELD nicht zulässig.
Ursache . . . . : Einer der folgenden Fehler ist aufgetreten: Spalte IMBELD
ist eine Zielspalte in einer Anweisung UPDATE oder INSERT für Tabelle
IPDOCIM in xx. Es wurde ein Nullwert festgelegt, um in dieser Spalte
eingefügt oder aktualisiert zu werden, oder es wurde kein Wert für die
Spalte in einer Anweisung INSERT angegeben und für die Spalte sind keine
Nullwerte zulässig. Der Nullwert wurde mit der relativen Eintragsnummer 1
in der Liste VALUES, SELECT oder in der SET-Klausel angegeben.
-- Spalte IMBELD ist eine Zielspalte in einer Anweisung ALTER für Tabelle
IPDOCIM in xx. Das Attribut der Spalte IMBELD darf nicht in NOT NULL
geändert werden, da bereits ein Nullwert mit der Eintragsnummer 1 der Spalte
vorhanden ist.
-- Variable IMBELD ist eine Zielvariable in einer SQL-Prozedur, -Funktion

wieder
selbst wenn ich es in

Update xx/ipdocim a
Set(a.imbeld, a.imadrn, a.imbelj) =
(Select '20130101',
akkto, '13'
from xxx/ako01pf b where a.imbeln = b.akanr and b.akkdt2 >
130101)
where imbeln between 140000 and 167399
and imbela = 'AS'
and imbelj <> 13
ändere bekomme ich den Fehler.

Was will er von mir?


Ein normales select auf die Daten ergibt

Beleg-ID: Belegdatum Beleg-ID: Adreßnummer KTO KDT2
Belegnummer CCYYMMTT Nummernkreis-Jahr Ident Auft.
nummer Datum
148.127 2003.09.15 03 11.481 30047 13.04.19
148.127 2003.09.15 03 11.481 30047 13.04.19
148.127 2003.09.15 03 11.481 30047 13.04.19
148.854 2003.09.22 03 6.092 29435 13.04.30
148.854 2003.09.22 03 6.092 29435 13.04.30
148.854 2003.09.22 03 6.092 29435 13.04.30
148.854 2003.09.22 03 6.092 29435 13.04.30
149.267 2003.09.16 03 11.451 7097 13.05.06
149.331 2003.09.16 03 11.571 4298 13.05.07
149.352 2003.11.03 03 3.147 8672 13.05.07

Fuerchau
02-12-13, 11:38
Du benötigst noch einen

and exists (select * from ako01pf c where a.imbeln = c.akanr and c.akkdt2 >
130101)

Wenn nämlich kein Satz gefunden wird, liefert der Subselect NULL-Werte.
Diese sind wohl in deiner Zieltabelle nicht zulässig.
Anmerkung:
Wenn NULL-Werte zulässig wären, hättest du die Inhalte für nicht existierende Daten auf NULL gesetzt!

KingofKning
02-12-13, 13:22
Jo danke Dir,

jetzt läuft der Sack aber wieder auf den Fehler das angeblich "Ergebnis der Anweisung enthält mehr als eine Zeile"
obwohl ich ein dsitinct beim select gemacht habe.

Da ja ein fetch first row in dem select nicht zulässig ist, würde ich es jetzt über eine Funktion machen wollen.

Werde noch was tüfteln.....

GG

Fuerchau
02-12-13, 15:54
Ein Subselect erlaubt auch Aggregate, vielleicht hilfts ja:
from (select a, b, min(c) from myfile where ... group by a, b) x