Anmelden

View Full Version : Update mit zwei Dateien



hs
31-03-04, 15:02
Hallo AS400-Gemeinde,

habe ein Problem, das hier mit Sicherheit schon besprochen worden ist, aber offensichtlich funktioniert im neuen Forum die Suchfunktion nicht mehr (nur so kann ich es mir erklären, das bei der suche nach "update" kein einziger Treffer gefunden wird).

Möchte ein update machen mit Select über zwei Dateien:

Datei A Datei B
ArtNr1 ArtNr2
Lagerort1 Lagerort2

Update auf Datei B:
Alle Artikel mit Lagerort2(Datei B) <> Lagerort1(Datei A) -> Lagerort2 = Lagerort1 setzen.

Folgende Syntax habe ich probiert:
update dateib set lagerort2 = (select lagerort1 from Dateia, Dateib where artNr1 = ArtNr2 and lagerort1 <> lagerort2)
where exists
(select lagerort1 from Dateia, Dateib where artNr1 = ArtNr2 and lagerort1 <> lagerort2)

Fehlermeldung:
Ergebnis der Anweisung enthält mehr als eine Zeile.

(ArtNr2 ist mehrfach in dateib, ArtNr1 eindeutig, da Teilestamm)

Wie lautet dann die Syntax?

Danke
HS

Fuerchau
31-03-04, 15:11
Füge einen DISTINCT in deinem 1. Subselect ein, da du nur den einen Lagerort haben willst.

hs
31-03-04, 15:22
Hatte ich schon versucht, hat leider nichts gebracht.

Bei der Fehlermeldung steht noch:
Fehlerart 2 wurde durch eine Unterauswahl eines Basisprädikats mehr als eine
Zeile erstellt. Es ist nur eine Zeile zulässig.

Marimari1009
31-03-04, 18:28
Hallo,
probiers mal mit:
update dateib set lagerort2 = (select lagerort1 from Dateia, where artNr1 = ArtNr2 and lagerort1 <> lagerort2)

Das müßte reichen. Der Select für die Existenz ist m.E. hier überflüssig, ebenso wie die Angabe von DateiB im ersten Select; dieser könnte der Grund für die zusätzliche Ergebniszeile sein.

Ich habe mangels entsprechender Dateien natürlich nicht testen können; deshalb: Vorsicht.

MfG
Klaus Hardy

Fuerchau
31-03-04, 18:57
update dateib set lagerort2 = (select distinct lagerort1 from Dateia where artNr2 = ArtNr1)
where artnr2 in (select artnr1 from Dateia) and lagerort2 <> (select lagerort1 from Dateia where artNr1 = ArtNr2)

Das Prüfen kannst du dir allerdings sparen, da ein Update mit dem gleichen Wert ja unschädlich ist:

update dateib set lagerort2 = (select distinct lagerort1 from Dateia where artNr2 = ArtNr1)
where artnr2 in (select artnr1 from dateia)

Der Subselect stellt die Beziehung über die Artikelnr her, distinct ist erforderlich, wenn Dateia mehrere Sätze mit der gleichen Artikelnr und Lagerort hat. Enthält Dateia aber gleiche Artikel mit unterschiedlichen Lagerorten funktioniert das überhaupt nicht.

Die Where-Klausel des Update prüft auf vorhandene Artikel in Dateia, da sonst Null-Werte beim subselect auftreten.

hs
01-04-04, 08:25
Danke euch beiden!
Hat wunderbar geklappt.

Gruß
HS