-
SQL Delelte???
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
-
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)
-
Hey danke für die schnelle Hilfe. Ich werde das mal ausprobieren. Danke
Gruß
Sascha
-
 Zitat von Fuerchau
...
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.
-
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).
-
 Zitat von Fuerchau
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.
-
Nur als Anmerkung:
Mein Tool SQLCPY löst solche Aufgaben auch schnell und problemlos.
-
Danke für eure Tips. Ich hatte mehrere Schlüssel. Hat mit !! (Concat) bestens geklappt. Danke
-
Huch...ein Problem habe ich da noch. Wenn ich mein Statement
PHP-Code:
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?!
-
 Zitat von JonnyRico
Huch...ein Problem habe ich da noch. Wenn ich mein Statement
PHP-Code:
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
-
Hallo Birgitta,
danke das mache ich aber leider ist das noch nicht des Rätsels Lösung. Mir ist aber inzwischen aufgefallen, das das bei jedem Delete Statement in embedded SQL passtiert, wo ich eine Where Klausel mit eingeben will. Was mache ich da falsch?
Gruß
Sascha
Similar Threads
-
By christian_lettner in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 16-11-06, 10:15
-
By FNeurieser in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 11-10-06, 14:53
-
By malzusrex in forum IBM i Hauptforum
Antworten: 8
Letzter Beitrag: 19-09-06, 11:04
-
By Kaufmann in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 28-06-06, 14:11
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 01-06-06, 09:43
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks