Anmelden

View Full Version : SQL: Update in Datei B, wenn Datei A best. Info enthält



Seiten : [1] 2

dino
22-09-11, 08:53
Hallo zusammen,
habe bisher SQL nur für Update usw. einer einzigen Datei genutzt.
Wie ist die exakte Syntax, wenn ich ein Update in Datei B/Feld B durchführen möchte, wenn Datei A/Feld A z.B. den Inhalt "X" hat ?

Fuerchau
22-09-11, 08:58
Update DateiB B set B.FeldB=Wert
where exists (select * from DateiA where B.Key=A.Key and A.FeldX='A')

Wert kann auch ein Select sein:

Wert:= (Select C.Feld from DateiC C where b.key = c.key)

tarkusch
16-10-12, 09:17
Update DateiB B set B.FeldB=Wert
where exists (select * from DateiA where B.Key=A.Key and A.FeldX='A')

Wert kann auch ein Select sein:

Wert:= (Select C.Feld from DateiC C where b.key = c.key)

Hallo Herr Fuerchau,

Habe in die Datei ZSTDP ein neues Feld hinzugefügt(STS) und wollte es mit dem Feld(VKO) von der Datei ZW9ARB auffüllen.

Bekomme aber die Meldung:
Nullwerte für Spalte oder Variable STS nicht zulässig.


UPDATE ZSTDP B SET
B.STS = (SELECT A.VKO FROM
ZW9ARB A WHERE B.RMC = A.RCD)


Beim Select ausführen bekomme ich aber keine Nullwerte.


Gruß

Tarki

Fuerchau
16-10-12, 09:25
In dem Inner-Select bestimmst du die Beziehung der Herkunft.
Aber du hast wohl auch Daten in ZSTDP wo du keine Entsprechung in ZW9ARB hast, daher der Null-Wert.
Deshalb die Where-Klausel mit Exists zur Update-Anweisung.

Alternativ kannst du auch "coalesce( (select ...), b.sts)" in der Set-Anweisung verwenden.
Mit dem Exists wirds aber u.U. schneller, da weniger Updates durchgeführt werden.

BenderD
16-10-12, 09:33
In dem Inner-Select bestimmst du die Beziehung der Herkunft.
Aber du hast wohl auch Daten in ZSTDP wo du keine Entsprechung in ZW9ARB hast, daher der Null-Wert.
Deshalb die Where-Klausel mit Exists zur Update-Anweisung.

Alternativ kannst du auch "coalesce( (select ...), b.sts)" in der Set-Anweisung verwenden.
Mit dem Exists wirds aber u.U. schneller, da weniger Updates durchgeführt werden.

... was aber (wieder einmal) nicht zum selben Resultat führen muss. Bei der Where exists Variante werden Sätze ohne Entsprechung in Ruhe gelassen, bei der coalesce Variante auf einen Initwert gesetzt...

... mit Brille ... habe das b.xxx im coalesce nicht gesehen

D*B

tarkusch
16-10-12, 09:57
In dem Inner-Select bestimmst du die Beziehung der Herkunft.
Aber du hast wohl auch Daten in ZSTDP wo du keine Entsprechung in ZW9ARB hast, daher der Null-Wert.
Deshalb die Where-Klausel mit Exists zur Update-Anweisung.

Alternativ kannst du auch "coalesce( (select ...), b.sts)" in der Set-Anweisung verwenden.
Mit dem Exists wirds aber u.U. schneller, da weniger Updates durchgeführt werden.

Habe schon vorher mit exists herumexperimentiert, aber
ich weiss nicht wie ich das exist im Statement einbauen soll.

Gruß

Tarki

Fuerchau
16-10-12, 10:39
UPDATE ZSTDP B SET
B.STS = (SELECT A.VKO FROM
ZW9ARB A WHERE B.RMC = A.RCD)
where exists (select * from ZW9ARB C WHERE C.RMC = A.RCD)

tarkusch
16-10-12, 10:49
Dieses SqlStatement hätte ich schon versucht, aber bekomme die Fehlermeldung:
Qualifikationsmerkmal für Spalte oder Tabelle A nicht definiert.

Wieso erkennt er im exists-Teil die Datei ZW9ARB A nicht an?

bzw. wie würde das Statement eigentlich mit coalesce aussehen?

Performance wäre eigentlich egal, da ich das Statement nur genau 1 mal brauche.

malzusrex
16-10-12, 11:09
ich denke das letzte müste C.RCD heißen

where exists (select * from ZW9ARB C WHERE B.RMC = C.RCD)

tarkusch
16-10-12, 11:24
Danke!
Ihr seid einfach die BESTEN!

Gruß

Tarki