-
Super, danke Fuerchau und BenderD, das hat mir beides gut weitergeholfen. Die Abfrage funktioniert nun.
Aber wie Fuerchau schon beschrieben hat, wird 0 geliefert, wenn nichts gefunden wird (Auch mit 'fetch first 1 rows only'). Wie kann ich es vermeiden, dass das Feld teat05 überschrieben wird, wenn das Select Ergebnis 0 liefert?
Zum Verständnis meiner Abfrage: Ich möchte, abhängig von der Artikelnummer, die Preise in son01pf der Firma 01 in die tst1pf der Firma 10 schreiben. Das sind ca. 700 Preise. Aber das SQL updated das Feld teat05 in allen 8000 Zeilen der Firma 10 in der tst01pf.
update tst01pf t
set t.teat05= coalesce((select s.soeipr
from son01pf s
where t.tetenr = s.soid4
and s.sofa =01
and s.sodtbi >= 161231
and s.soeipr <> 0
and s.soeipr is not null
and s.soid1=30600
and t.tefa = 10
and s.sosts = 0
fetch first 1 rows only), 0)
where t.tefa = 10
Gruß
Progras
-
coalesce((select nullif(soeipr, 0)...), teat05)
Wenn "soeipr = 0" dann nimm NULL, wenn das Ergebnis des Selects NULL, dann nimm den Ursprung.
-
Die korrekte Syntax für den Update einer Tabelle auf Basis einer zweiten Tabelle sieht wie folgt aus:
Code:
Update YourTable a
set YourColumn = (Select Distinct YourNextColumn
From NextTable b
Where a.Key1 = b.Key1
and a.Key2 = b.Key2
...
and a.KeyN = b.KeyN)
Where Exists (Select *
from NextTable c
Where a.Key1 = c.Key1
and a.Key2 = c.Key2
...
and a.KeyN = c.KeyN);
Dadurch wird sichergestellt, dass für jeden Datensatz aus der ersten Datei genau ein Datensatz aus der zweiten Datei gefunden wird. Fehlen Datensätze in der ersten Datei oder der zweiten Datei, werden diese elimiert bzw. erfolgt kein Update auf den entsprechenden Satz.
Damit ist eine explizite Konvertierung von NULL-Werten mittels COALESCE oder IFNULL nicht erforderlich.
Doppelte Datensätze werden ebenfalls vermieden.
Birgitta
-
Der "Distinct" (= Eindeutig) sorgt nur dafür, dass es keine doppelten Werte gibt.
Er verhindert nicht, dass mehr als 1 Zeile zurückkommt wenn es mehrere unterschiedliche Werte gibt.
-
 Zitat von Fuerchau
coalesce((select nullif(soeipr, 0)...), teat05)
Wenn "soeipr = 0" dann nimm NULL, wenn das Ergebnis des Selects NULL, dann nimm den Ursprung.
Mit dieser Erweiterung hat es dann letztendlich funktioniert. Die Verion von BenderD habe ich nicht getestet, klingt aber plausibel. Ist noch vereinfacht.
@Birgitta: Dieses Update hat wieder zur gleichen Meldung mit den Nullwerten geführt. Konnte es aber für ein anderes Problem gut gebrauchen.
-
 Zitat von Progras
update tst01pf t
set t.teat05= coalesce((select s.soeipr
from son01pf s
where t.tetenr = s.soid4
and s.sofa =01
and s.sodtbi >= 161231
and s.soeipr <> 0
and s.soeipr is not null
and s.soid1=30600
and t.tefa = 10
and s.sosts = 0
fetch first 1 rows only), 0)
where t.tefa = 10
Progras
Da sieht mir schwer nach einem ERP System aus Koblenz aus ;-)
GG 4943
-
 Zitat von KingofKning
Da sieht mir schwer nach einem ERP System aus Koblenz aus ;-)
GG 4943
Kann ich nichts dazu sagen. Bin Azubi und dies war ein Problem in der Schule, welches ein Mitschüler mitgebracht hatte.
-
 Zitat von Progras
Super, danke Fuerchau und BenderD, das hat mir beides gut weitergeholfen. Die Abfrage funktioniert nun.
Aber wie Fuerchau schon beschrieben hat, wird 0 geliefert, wenn nichts gefunden wird (Auch mit 'fetch first 1 rows only'). Wie kann ich es vermeiden, dass das Feld teat05 überschrieben wird, wenn das Select Ergebnis 0 liefert?
Zum Verständnis meiner Abfrage: Ich möchte, abhängig von der Artikelnummer, die Preise in son01pf der Firma 01 in die tst1pf der Firma 10 schreiben. Das sind ca. 700 Preise. Aber das SQL updated das Feld teat05 in allen 8000 Zeilen der Firma 10 in der tst01pf.
update tst01pf t
set t.teat05= coalesce((select s.soeipr
from son01pf s
where t.tetenr = s.soid4
and s.sofa =01
and s.sodtbi >= 161231
and s.soeipr <> 0
and s.soeipr is not null
and s.soid1=30600
and t.tefa = 10
and s.sosts = 0
fetch first 1 rows only), 0)
where t.tefa = 10
Gruß
Progras
... das lässt sich auch einfach so heilen:
update tst01pf t
set t.teat05= coalesce((select s.soeipr
from son01pf s
where t.tetenr = s.soid4
and s.sofa =01
and s.sodtbi >= 161231
and s.soeipr <> 0
and s.soeipr is not null
and s.soid1=30600
and t.tefa = 10
and s.sosts = 0
fetch first 1 rows only), t.teat05)
where t.tefa = 10
wobei der fetch first möglicherweise nicht das ist, was man haben will, der holt nämlich der erstbesten, den er gerade findet. Da sollte man schon mal prüfen, ob es da eine ausreichende Schlüsselbeziehung gibt, oder eher mit min oder select max(s.soeipr) oder min(...) arbeiten.
D*B
Similar Threads
-
By woy in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 26-03-15, 09:49
-
By Robi in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 04-03-14, 15:49
-
By msost in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 04-12-13, 16:39
-
By RM Haaßengier in forum Archiv NEWSblibs
Antworten: 0
Letzter Beitrag: 10-07-02, 16:20
-
By Tornado in forum NEWSboard Drucker
Antworten: 4
Letzter Beitrag: 13-08-01, 11:22
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks