Anmelden

View Full Version : SQL mit 2 Dateien



Seiten : [1] 2

KingofKning
23-12-08, 08:00
Hallo *all,

im Moment stehe ich ein wenig auf der Leitung.

Was mach ich hier falsch?
Token , ungültig. Gültige Token: SET.



update ADR01PF T01,
ADR04PF T02
set A4AFO4 = 2
WHERE T01.ADKTO = T02.A4KTO

AND( ADSTS = 0
AND ADFA = 1
AND AD##26 IN (420, 105, 13, 36, 436)
AND T01.ADID1 <> 11008)

Pikachu
23-12-08, 08:06
Du kannst in SQL nur eine einzige Datei gleichzeitig aktualisieren.

KingofKning
23-12-08, 08:11
Ich will ja auch nur eine Datei updaten nämlich die adr04pf, brauch aber die erste um die Daten sauber zu bekommen.

Wie müßet das denn umgebaut werden damit das passt?
Gruß
Gregor

Fuerchau
23-12-08, 08:17
Update MyFileA a
set Field = (select Field from MyFileB b where a.key=b.key and ...)
where a.field = ... and a.field2=...
and a.key in (select c.key from MyFileB c where ...)

Sieht etwas kompliziert aus, ist es aber nicht:

Im Subselect (select ...) wählst du das Quell-Feld mit dem Bezug über where, in der letzten Where-Klausel bestimmst du deine Sätze und mit dem letzten Subselect " ... in (select...) " stellst du sicher, dass nur Sätze in A upgedatet werden, die auch in B vorhanden sind.
Ansonsten bekommst du ggf. NULL-Werte die in Datei A auch erlaubt sein müssten.
Das kannst du nur dann sparen, wenn du sicher bist, dass in B alle Sätze für A vorhanden sind.

KingofKning
23-12-08, 08:24
Hallo,

ich möchte ja die Konstante 2 zuweisen.

Oder verstehe ich da etwas falsch?

B.Hauser
23-12-08, 08:27
Hallo,

Du must in der Where-Bedingung einen Sub-Select angeben.
Etwa so:

update ADR01PF T01,
set A4AFO4 = 2
WHERE Exists (Select Distinct ADKTO
from ADR04PF
Where ADKTO = A4KTO
and ADSTS = 0
and ADFA = 1
and AD##26 IN (420, 105, 13, 36, 436)
AND ADID1 <> 11008

Ohne Garantie, da ich nicht weiss, welche Felder aus welcher der beiden Dateien sind.

Birgitta

Fuerchau
23-12-08, 09:04
Hat DISTINCT bei EXISTS nicht eher nagativen Einfluss ?

KingofKning
23-12-08, 09:12
Hallo,
danke für den Hinweis, jetzt sieht es so aus.
update ADR04PF t02
set A4AFO4 = 2

WHERE exists (select adkto from adr01pf t01
where t01.adkto = t02.a4kto
AND( ADSTS = 0
AND ADFA = 1
AND AD##26 IN (420, 105, 13, 36, 436)
AND ADID1 <> 11008))

und scheint auch zu funktionieren.

Mein Problem ist aber das ich jetzt nur 97 Sätze im Update habe, ich hatte mir aber ein Query gebastelt und das mit rtv in ein SQL umgewandelt. Beim Query hatte ich aber 265 Sätze als Ergebnis.

Wie kann ich denn jetzt ab geschicktest rausbekommen warum er nicht das macht was ich mir wünsche.

Der Select sieht so aus,
SELECT
ALL t01.adkto, T02.A4AFO4
FROM SOE01/ADR01PF T01,
SOE01/ADR04PF T02
WHERE T01.ADKTO = T02.A4KTO
AND( ADSTS = 0
AND ADFA = 1
AND AD##26 IN (420, 105, 13, 36, 436)
AND T01.ADID1 <> 11008)

Wobei mir auf Anhieb auffällt, das im Ergebnis alle die Sätze fehlen wo A4AFO4 den Wert Null hat (Format numerisch)
Kann man den Aufbau einer Query eigentlich anzeigen lassen?

Gruß
Gregor

Fuerchau
23-12-08, 09:54
Das Problem ist, dass der RTV keinen LEFT JOIN erkennt sondern leider immer einen Inner join generiert.

Das Selbe gilt eben auch, für den EXISTS, der einem Inner Join entspricht.

Prüfe mal, ob deine Bedingung denn so stimmt, denn EXISTS und NOT EXISTS (entspräche NULL), würde doch ALLE Sätze umfassen.

Also irgendeine Zusatzbedingung fehlt da wohl noch.

Prüfe mal die Feldbedingungen von T01 zu T02.

PS:
Mit meinem SQLCPY wäre das nicht passiert ;)

KingofKning
23-12-08, 10:14
Wobei nachvollziehen kann ich es nicht.

Ich nehme die Datei adr01pf und selektiere die mit der where Bedingung. Dann habe ich die Datei adr04pf verküpfe diese mit der adr01pf über das Feld adr01pf.adkto = adr04pf.a4kt0 und will ja dort das Feld adr04pf.a4afo4 auf den Wert 2 setzen.
Wieso ich dann nur die Sätze angezeigt bekomme wo das Feld a4afo4 einen Wert hat verstehe ich nicht.

Gruß
Gregor