View Full Version : SQL-Delete in Verbindung mit Common Table Expressions
Hallo,
ist es möglich, einen Delete-Befehl in Verbindung mit einer Common Table Expression zu verwenden oder ist das gar nicht erlaubt? Bei meinem Beispiel bringt das interaktive SQL den Fehler: "Schlüsselwort DELETE nicht erwartet. Gültige Token: ( SELECT VALUES."
Beispiel:
with cte as
(select sanr from Datei
where sanr = 2906040)
delete from datei
where sanr in (select SANR from cte)
Vielen Dank im Voraus!
Michi
Warum nicht direkt ?
delete from datei
where sanr in (select sanr from Datei
where sanr = 2906040)
Da frage ich mich ob Datei = Datei ist!
Delete from Datei where sanr = 2906040
wäre hier für mich der normale Weg.
andreaspr@aon.at
03-12-14, 09:01
Kurz gesagt: Nein geht nicht.
Die CTE kannst du nur in Kombination mit einem Fullselect verwenden.
Das Beispiel ist nur ein fiktives Beispiel. Der eigentliche Befehl schaut ein wenig komplexer aus:
with apc00_one as
(select pcartn, pckdnr, max(pcsanr) pcsanr
from smkdift/apc00 b
where b.pcstat='X'
group by pcartn, pckdnr
order by pckdnr, pcartn),
apc00_two as
(select * from smkdift/apc00 a
where pcsanr in (select pcsanr from apc00_one)
and pckdnr = ' 230964'),
apc00_three as
(select a.PCSANR
from smkdift/apc00 a
left join apc00_two b on a.pckdnr=b.pckdnr
and a.pcartn=b.pcartn
where a.pcstat=' '
and ((a.pcbekz=2 and b.pcbekz=2) or
(a.pcbekz=3 and b.pcbekz=3 and a.pcekne=b.pcekne)) )
delete from smkdift/apc00
where pcsanr in (select PCSANR from apc00_three)
Der Befehl mit den CTEs existierte schon in Verbindung mit der Select-Anweisung und ich habe diese als Basis für den Delete-Befehl verwenden wollen. Was aber wie erwähnt anscheinend nicht funktioniert!
Hallo Andreas!
Schade! Habe ich´s mir doch gedacht.
Vielleicht nochmal für alle:
Common Table Expressions (CTE) sind Bestandteil des SELECT-Statements und kein Bestandteil der Data-Manipulation-Befehle INSERT/UPDATE oder DELETE.
Sofern natürlich z.B. ein INSERT auf einem SELECT-Statement beruht können CTEs natürlich in Verbindung mit dem SELECT-Statement verwendet werden.
Birgitta
Der CTE ist nur eine vereinfachte Schreibweise für Derived Tables (Full-Subselect).
Anstelle von
where pcsanr in (select PCSANR from apc00_three)
kannst du auch
where pcsanr in (select PCSANR from (select pcartn, pckdnr, max(pcsanr) pcsanr
from .... ) apc00_three)
kodieren.