Anmelden

View Full Version : SQL with mit update/delete/insert



harkne
03-11-17, 08:43
Hallo zusammen,

ich habe im SQL den with bereits verwendet. Allerdings nur mit anschließendem SELECT. Könnte mir jemand die Syntax nennen wenn ich einen Update Delete oder Insert machen möchte oder eine Lektüre wo ich das finden kann.

Vielen Dank.

Viele Grüße Harald

Fuerchau
03-11-17, 09:01
WITH-Konstrukte sind nur Vereinfachungen bei der Verwendung von "derived Tables".
Man kann also
select * from (Select * from MyFile) x
inner join (Select * from Myfile2) y on x.Key = y.Key
verwenden.
Somit kann man eben auch bei Update/delete in der Where-Klausel mit scalaren Subselects umgehen:
update/delete .... MyFile x
where exists (
select * from (select * from MyFile) a inner join (select * from MyFile2) b on ...
where x.Key = a.Key ...
)

Beim Insert sieht es nicht viel anders aus:
insert into MyFileX
select ....

B.Hauser
03-11-17, 09:42
Common Table Expressions (WITH ...) sind Bestanddteil des SELECT-Statements und nicht direkt des UPDATE oder DELETE Statements.
In Updates ist nur der FULL-Select zulässig, d.h. keine Common Table Expressions. Du ähnliches wie mit CTEs mit verschachtelten Sub-Selects erreichen.
Wenn Du einen Insert auf der Basis eines Select machst, kannst Du Common Table Expressions verwenden.
Insert into Table
(With X as ...
Select ...)

Birgitta

harkne
03-11-17, 11:39
OK danke, werde ich probieren.

Ich dachte ich könnte auch vor dem Update bereits eine Teilauswahl machen und diesen dann in der WHERE Klausel verwenden.

Nach der Art.

with x as
select * from Tabelle1 where Status = 'V'

with y as
select * from Tabelle2 where Status = 'X'

und dann

update Tabelle3 set Status = 'V' where exists (select * from x where ID = x.ID) or
exists (select * from y where ID = y.ID)

OK, ist jetzt kein gutes Beispiel, da die oberen SELECTS ziemlich einfach sind. Mir ging es nur um die Syntax wie so was anzugeben ist.

Fuerchau
03-11-17, 12:34
Hängt davon ab, wie komplex die Abfrage ist.
Der einfachste Weg ist natürlich:

update myfile set F1=10
where F1=0

In der Where-Klausel sollte man dann Exists verwenden, wenn der Update von Inhalten einer anderen Datei abhängig ist. Und dabei ist jeder Komplexitätsgrad erlaubt (Group by, from (select ), außer With und Order).
Vielleicht nicht jeder, da ich glaube, dass immer noch nicht mehr als 32 Tabellen in einem Select vorkommen können, aber vielleicht ist diese Erweiterung ja auch an mir vorbeigegangen.