Anmelden

View Full Version : SQL-Delete in Verbindung mit Common Table Expressions



mott
03-12-14, 08:48
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

malzusrex
03-12-14, 08:50
Warum nicht direkt ?
delete from datei
where sanr in (select sanr from Datei
where sanr = 2906040)

Fuerchau
03-12-14, 08:54
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.

mott
03-12-14, 09:06
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!

mott
03-12-14, 09:07
Hallo Andreas!

Schade! Habe ich´s mir doch gedacht.

B.Hauser
03-12-14, 09:22
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

Fuerchau
03-12-14, 09:30
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.