-
Für den Subselect kannst du eine Klammerstufe weglassen, da nur der Select-Ausdruck in Klammern zu setzen ist.
Ein Alias betrifft nur den jeweiligen Kontext, in deinem Fall nur die Subselects. Der eine Subselect hat mit dem Anderen nichts zu tun.
Nun zur Reihenfolge:
Die Where-Klausel des Hauptselects schließt nur die Zeilen ein, die für den Update relevant sein sollen.
Der 1. Subselect hat aber eine andere Beziehung als der Hauptwhere und somit kann es eben vorkommen, das zu dem zu ändernden Satz das Pendant gar nicht vorhanden ist. Also nicht für jeden Typ-N-Satz gibt es auch einen Typ-2-Satz.
Und genau dann kommt es zum NULL-Ergebnis.
Der 2. Subselect (exists) stellt nun sicher, das für jeden zu ändernden Satz auch ein Pendant als Quelle vorhanden ist und somit NULL-Werte ausgeschlossen werden (solange nicht NULL auf Feldebene zulässig wäre).
Du könntest den 2. Subselect weglassen, wenn du den 1. in "coalesce((select ...) + 1.8, a.Wert)" änderst. Dies führt aber u.U. zu mehr unnötigen Änderungen, da ja der Satz ohne pendant mit sich selbst überschrieben wird.
Zu guter Letzt, betrachte mal deinen Inner-Where:
where b.Jahr = 2020 and b.Typ = '2' and
a.Jahr = b.Jahr and a.Artnr = b.Artnr
Da du im Hauptwhere bereits auf 2020 einschränkst, kann die zusätzliche Einschränkung im Subselect doch entfallen.
Generell gilt beim Subselect:
Ist kein Ergebnis zu finden, wird NULL gemeldet, also genau das selbe wie auch beim Left Join.
Einen "Inner-Join"-Subselect gibt es nicht.
Es gibt daher auch immer mal wieder viele Joblog-Hinweise, dass NULL-Indikatoren fehlen:
select count(*) into : MyCount
from table
where ....
Da hierfür kein Cursor verwendet wird, betrachtet SQL dies wie einen Subselect und liefert NULL falls die Whereklausel nichts findet.
Machst du das selbe per Cursor (wie z.B. via STRSQL), bekommst du ganz normal 0 geliefert.
Besser wäre dann hier:
select coalesce(count(*), 0) into : MyCount
from table
where ....
oder eben einen NULL-Anzeiger (nicht zu vergessen, den NULL-Anzeiger abzufragen oder das Zielfeld vorher zu löschen, da es im NULL-Fall den vorherigen Wert behält).
Similar Threads
-
By sonicreducer in forum NEWSboard Programmierung
Antworten: 11
Letzter Beitrag: 12-04-16, 12:52
-
By andreaspr@aon.at in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 01-12-15, 11:28
-
By JanItor in forum IBM i Hauptforum
Antworten: 10
Letzter Beitrag: 11-02-15, 16:13
-
By KingofKning in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 17-11-14, 15:52
-
By Joe in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 15-04-03, 16:06
Tags for this Thread
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