[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Apr 2002
    Beiträge
    792

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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)
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Apr 2002
    Beiträge
    792
    Hey danke für die schnelle Hilfe. Ich werde das mal ausprobieren. Danke

    Gruß

    Sascha

  4. #4
    Registriert seit
    Oct 2004
    Beiträge
    251
    Zitat 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.

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Oct 2004
    Beiträge
    251
    Zitat 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.

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Nur als Anmerkung:
    Mein Tool SQLCPY löst solche Aufgaben auch schnell und problemlos.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Apr 2002
    Beiträge
    792
    Danke für eure Tips. Ich hatte mehrere Schlüssel. Hat mit !! (Concat) bestens geklappt. Danke

  9. #9
    Registriert seit
    Apr 2002
    Beiträge
    792
    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?!

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat 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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  11. #11
    Registriert seit
    Apr 2002
    Beiträge
    792
    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

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    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
  •