PDA

View Full Version : Komplexes SQL-Statement



Nickelär
26-11-04, 13:05
Zuerst mal hallo zusammen.

Ich habe ein Problem mit einem SQL-Statement auf der AS/400 bzw. iSeries.

Es soll ein Feld geändert werden, wenn 4 verschiedene Bedingungen erfüllt sind.

Hier die Tabellen:

Tabelle Artikel (atstam):

Firmen-Nr. (firnr)
Artikel-Nr. (artnr01)
Präfix (artnr02)
Artikelhauptgruppe (arthg)
etc.

Tabelle Art-Lief-Verknüpfung (artlif):

Firmen-Nr. (firnr)
Artikel-Nr. (artnr01)
Lieferant (lifnr)

Ich möchte in allen Datensätzen die Artikelhauptgruppe auf z.B. '007' setzen, wenn:

1. die Firmennummern in beiden Tabellen gleich sind
2. die Artikelnummern in beiden Tabellen gleich sind
3. der Präfix in der Artikeltabelle nicht 'XYZ' ist
4. der Lieferant in der Art-Lief-Verknüpfung gleich '0815' ist

Einen SELECT mit den Bedingungen bekomme ich hin, aber den UPDATE-Befehl, aus welchen Gründen auch immer, nicht. (Wahrscheinlich stelle ich mich zu blöd an)

Hier mein bisheriges SQL-Statement:

update atstam
set arthg = '007'
where exists (
select atstam.firnr, atstam.artnr01, atstam.artnr02, atstam.arthg, artlif.lifnr
from atstam, artlif
where atstam.firnr = artlif.firnr
and atstam.artnr01 = artlif.artnr01
and atstam.artnr02 <> 'XYZ'
and artlif.lifnr = '0815')

Mittlerweile läuft's zwar durch, jedoch werden im Moment alle Datensätze geändert.

Bin jetzt schon ne Weile am rumdoktorn und bekomme es einfach nicht hin.

Ihr seid sozusagen meine letzte Hoffnung ;-)

Für Eure Hilfe jetzt schon herzlichen Dank

Gruss, der Nickelär

RobertPic
26-11-04, 13:34
Du darfst im Subselect nicht nocheinmal den Artikelstamm angeben. Es werden alle Updates gemacht, wenn zumindest 1 Satz die Bedienungen erfüllt.

Besser daher:

update atstam
set arthg = '007'
where atstam.artnr02 <> 'XYZ' and atstam.firnr in (
select artlif.firnr from artlif
where atstam.artnr01 = artlif.artnr01
and artlif.lifnr = '0815')

LG Rob

B.Hauser
26-11-04, 13:36
Hallo,

Du musst in Deinem Subselect nochmal mit die beiden Artikelstämme verknüpfen über den eindeutigen Schlüssel (vermutlich Artikel-Nr.) verknüpfen.

Etwa so:


update atstam a
set a.arthg = '007'
where exists (select b.firnr, b.artnr01, b.artnr02, b.arthg, artlif.lifnr
from atstam b, artlif
where b.firnr = artlif.firnr
and b.artnr01 = artlif.artnr01
and b.artnr02 <> 'XYZ'
and artlif.lifnr = '0815'
and a.artnr01 = b.artnr01)


Birgitta

Pikachu
26-11-04, 13:45
Hallo !

Deine Unterabfrage liefert vermutlich immer das gleiche Ergebnis, egal welchen Datensatz der UPDATE gerade bearbeitet. Aber wenn du in deiner SQL-Anweisung

select atstam.firnr, atstam.artnr01, atstam.artnr02, atstam.arthg, artlif.lifnr from atstam, artlif

durch

select * from artlif

ersetzt, dann kannst du mit deinen Bedingungen einen Bezug zum aktuellen Datensatz im UPDATE herstellen und dann sollte es gehen.

Viele Grüße
Jürgen

Nickelär
26-11-04, 14:27
Du darfst im Subselect nicht nocheinmal den Artikelstamm angeben. Es werden alle Updates gemacht, wenn zumindest 1 Satz die Bedienungen erfüllt.

Besser daher:

update atstam
set arthg = '007'
where atstam.artnr02 <> 'XYZ' and atstam.firnr in (
select artlif.firnr from artlif
where atstam.artnr01 = artlif.artnr01
and artlif.lifnr = '0815')

LG Rob
Vielen Dank für die prompte Hilfe.

Hat auch ohne Probleme funktioniert.

Nickelär
26-11-04, 14:28
Hallo,

Du musst in Deinem Subselect nochmal mit die beiden Artikelstämme verknüpfen über den eindeutigen Schlüssel (vermutlich Artikel-Nr.) verknüpfen.

Etwa so:


update atstam a
set a.arthg = '007'
where exists (select b.firnr, b.artnr01, b.artnr02, b.arthg, artlif.lifnr
from atstam b, artlif
where b.firnr = artlif.firnr
and b.artnr01 = artlif.artnr01
and b.artnr02 <> 'XYZ'
and artlif.lifnr = '0815'
and a.artnr01 = b.artnr01)


Birgitta
Vielen Dank auch Dir.

Leider hat Dein Statement bei mir nicht funktioniert, aber komme jetzt trotzdem weiter.

Nickelär
26-11-04, 14:30
Hallo !

Deine Unterabfrage liefert vermutlich immer das gleiche Ergebnis, egal welchen Datensatz der UPDATE gerade bearbeitet. Aber wenn du in deiner SQL-Anweisung

select atstam.firnr, atstam.artnr01, atstam.artnr02, atstam.arthg, artlif.lifnr from atstam, artlif

durch

select * from artlif

ersetzt, dann kannst du mit deinen Bedingungen einen Bezug zum aktuellen Datensatz im UPDATE herstellen und dann sollte es gehen.

Viele Grüße
Jürgen
Auch Dir ein herzliches Danke schön.

Auch Dein Statement hat mir weitergeholfen, so dass ich mir jetzt eine der beiden Varianten aussuchen kann ;-)

Ich hätte wahrscheinlich noch Stunden dafür gebraucht.