PDA

View Full Version : SQL Subselect mit exists und no exists



Seiten : [1] 2

camouflage
10-03-22, 09:15
Hallo Forum,

Ich steh wieder mal auf Kriegsfuss mit SQL.

Ich möchte ein Transaktionsfile mit einem Statuswert updaten, abhängig von einem Subselect des Masterfiles. Der Wert soll abhängig vom Record oder fehlen desselben sein.


Beispiel:
update Transaktion set Status = '1'
where exists (select * from Master where TrKey = MaKey and MaSts = '1')
or not exists (select * from Master where TrKey = MaKey);

Mache ich mir hier etwas zu einfach?

Danke für die Hilfe

Fuerchau
10-03-22, 09:59
Sollte so funktionieren.
Der 1. Exists schränkt ja zusätzlich auf and "MaSts = '1'" ein.
Der Not Exists prüft nur die tatsächliche Nicht-Existenz des Schlüssel.

Wenn du das ganze per Transaktion machen könntest, hast du immer die Chance, das Ergebnis vor einem Commit zu prüfen und wenn es nicht stimmt, das Programm abzubrechen um einen Rollback durchzuführen. Per Debugger könntest du auch SQLCODE auf -1 setzen um im Programm wahlweise Commit/Rollback zu machen.
Transaktionen sind auch zum Testen außerordentlich hilfreich.

camouflage
10-03-22, 10:26
Hi Baldur,

Danke für die Rückantwort. Es funktioniert wirklich so, wie gepostet, nur sollte man vorgängig gründlich die Daten prüfen. Mea culpa.

Fuerchau
10-03-22, 11:48
Gehört das nicht sowieso zum Handwerk;-)?

camouflage
10-03-22, 12:23
Qui sine peccato est vestrum, primus in illam lapidem mittat. ;-)

Fuerchau
10-03-22, 12:58
Immer diese Altgriechen:D.

B.Hauser
10-03-22, 15:58
Und warum willst Du denn 2 SELECT Statements verwenden, wenn eines reichen würde?


Update Transaktion
Set Status = '1'
Where Exists (Select *
From Master
Where (Trkey = Makey And Masts = '1')
Or Trkey <> Makey);

camouflage
10-03-22, 16:19
Danke Birgitta, bist ein Schatz ;-).

max40
11-03-22, 12:33
<colgroup><col><col></colgroup><tbody>
MaKey

MaSts



TEST1
0


TEST2
1

</tbody>


Für mein Verständnis würde der Status beim SQL von camouflage für MaKey=TEST1 nicht auf 1 setzen, da es keinen TEST1 Satz mit MaSts=1 gibt aber min. ein TEST1 Satz vorhanden ist.
Wärend beim Beispiel von Birgitta für TEST1 der Status auf 1 gesetzt wird, da zwar kein TEST1 Satz mit MaSts=1 gefunden wurde, aber ein Satz wo MaKey ungleich TEST1 ist.

Oder verstehe ich das falsch?

camouflage
11-03-22, 13:01
Max,

Du hast Recht.
Birgitta's Lösung updatet gleich alle Records. Kompliment zurück.
Meine ursprüngliche Lösung ist korrekt.