PDA

View Full Version : SQL Delelte???



Seiten : [1] 2

JonnyRico
21-02-05, 11:14
Hi,

ich hoffe mir kann jemand helfen. Ich komme mit einem Delete Statement nicht so ganz klar. Ich habe eine tempräre Tabelle erstellt (TEMP/TMPFSART) in der die Daten stehen die nicht gelöscht werden sollen. Der Rest soll weg.
Diese will ich aus einer anderen Tabelle löschen (XXX/BESTART01).
Wie muss das Statement aussehen? Mit der Forensuche bin ich leider nicht viel weiter gekommen ;o(

Gruß

Sascha

Fuerchau
21-02-05, 11:20
delete from mytab1
where mykey not in (select mykey from mytab2)

Wenn der Key aus mehreren Feldern besteht dann muss der Key zusammengebaut werden:

key1 concat key2 concat key3 ...

Falls eins der Felder numerisch ist dann: digits(keyn), also z.b.
key1 concat digits(keyn) ...

Komplett sähe das dann ungefähr so aus:

delete from mytab1
where key1 concat key2 concat key3 ... not in (select key1 concat key2 concat key3 ... from mytab2)

JonnyRico
21-02-05, 11:22
Hey danke für die schnelle Hilfe. Ich werde das mal ausprobieren. Danke

Gruß

Sascha

RobertPic
21-02-05, 11:32
...
Wenn der Key aus mehreren Feldern besteht dann muss der Key zusammengebaut werden:

key1 concat key2 concat key3 ...

Falls eins der Felder numerisch ist dann: digits(keyn), also z.b.
key1 concat digits(keyn) ...

Komplett sähe das dann ungefähr so aus:

delete from mytab1
where key1 concat key2 concat key3 ... not in (select key1 concat key2 concat key3 ... from mytab2)
Hat das einen bestimmten Grund, dass die Verknüpfung über mehrer Felder hier ignoriert wird?

ich löse das immer so:

delete from mytab1
where key1 not in (select mytab2.key1 from mytab2 where mytab1.key2 = mytab2.key2)

Ist um Häuser schneller, als die Konvertierung von numerischen Feldern - und außerdem werden dabei vorhande Zugriffspfade genutzt.

mfg
Robert P.

Fuerchau
21-02-05, 11:50
Solange du nur 1 Schlüsselfeld hast, geht das ja.
Aber was machst du bei mehr als 1 Schlüsselfeld ?
Häufig hat mandantenfähige Software auf jeder Datei mindestens 2 Schlüsselfelder.

SQL kann leider nur 1 Feld mit 1 Feld im Subselect abfragen.
Daher der Umweg über Concat. Und genau hier helfen keine Zugriffspfade es sei denn nachfolgendes kann verwendet werden:

Was die Geschwindigkeit angeht, so hast du nur teilweise Recht.
In deinem Beispiel wird der Subselect pro Satz ausgeführt, in meinem Beispiel nur 1 Mal.

Für weitere Performancegewinne kann man sowohl den Subselect als auch die Where-Bedingung ergänzen:

delete from mytab1
where key1 concat key2 concat key3 ... not in (select key1 concat key2 concat key3 ... from mytab2 where key1=x and Key2=y and ...)
where Key1=x and Key2=y and ...

Für den Subselect wird ein Zugriffspfad verwendet (wegen where) und eine temporäre Tabelle über die Teildaten aufgebaut.
Ggf. wird dann für den Concat-Key noch ein Pfad aufgebaut (hängt vom Release ab).

RobertPic
21-02-05, 12:16
Was die Geschwindigkeit angeht, so hast du nur teilweise Recht.
In deinem Beispiel wird der Subselect pro Satz ausgeführt, in meinem Beispiel nur 1 Mal.

Hier muss ich dir natürlich recht geben. Welche Methode die schnellere ist, hängt von den Mengengerüsten ab.

Da auch wir auch "mandantenfähige" Software haben, ist mir die Problematik nicht fremd.

Ich wollte die Möglichkeit hier auch nur anmerken, da bei uns die viele Update/Löschvorgänge (grosse Dateien mit Vorselektion + Subselect) mit dieser Methoder schneller sind.

mfg
Robert P.

Fuerchau
21-02-05, 12:20
Nur als Anmerkung:
Mein Tool SQLCPY löst solche Aufgaben auch schnell und problemlos.

JonnyRico
21-02-05, 13:22
Danke für eure Tips. Ich hatte mehrere Schlüssel. Hat mit !! (Concat) bestens geklappt. Danke

JonnyRico
21-02-05, 13:36
Huch...ein Problem habe ich da noch. Wenn ich mein Statement


delete from Bestv/Bestart
WHERE
BEARTN !! BEARTNV !! BELG !! BEFA Not in
(SELECT FSARTN !! FSARTNV !! FSLG !! FSFA as FSKey From TEMP/TMPFSART
)

aus RPG mit embedded SQL aufrufe, bekomme ich immer die Meldung. "Länge der Anweisung überschreitet 32.767 Zeichen."
Wie kann das sein? Das sind doch nicht mal 100?!

B.Hauser
21-02-05, 15:17
Huch...ein Problem habe ich da noch. Wenn ich mein Statement


delete from Bestv/Bestart
WHERE
BEARTN !! BEARTNV !! BELG !! BEFA Not in
(SELECT FSARTN !! FSARTNV !! FSLG !! FSFA as FSKey From TEMP/TMPFSART
)

aus RPG mit embedded SQL aufrufe, bekomme ich immer die Meldung. "Länge der Anweisung überschreitet 32.767 Zeichen."
Wie kann das sein? Das sind doch nicht mal 100?!

Das mag jetzt zwar nicht zur Fehlermeldung passen, aber verwende statt !! concat, da !! nicht international ist und evt. auch hier Probleme bereiten könnte!

Birgitta