Marc Reichelt: SQL: Lösche alle Einträge von Tabelle2 ohne Referenz zu Tabelle1

Hallo an alle,

ich arbeite derzeit an einer Android-Applikation. Diese verwendet einen Cache auf SQLite-Basis mit mehreren Tabellen, die sich referenzieren.

Konkret habe ich zwei Tabellen. Tabelle 1 und 2 haben beide einen primären Index "id". Tabelle 2 hat zusätzlich ein Feld namens "tabelle1_id", welches eine Referenz auf tabelle1.id darstellt. Wenn ein Eintrag von Tabelle 1 mit id=3 gelöscht wird, sollen alle Einträge der Tabelle 2 mit tabelle1_id=3 ebenfalls gelöscht werden. Also genau das, was man mit einem einfachen FOREIGN KEY lösen könnte.

Die Syntax von SQLite erlaubt es zwar, Tabellen mit FOREIGN KEYs anzulegen, diese werden aber nicht ausgewertet, da eine entsprechende Implementierung dafür zu fehlen scheint.

Nun möchte ich diesen Befehl also von Hand aufrufen:
"Lösche alle Einträge von tabelle2, deren tabelle1_id nicht in tabelle1.id vorkommen"

Welches ist die eleganteste Methode, um diesen Befehl auszuführen?

Freundliche Grüße & vielen Dank im Voraus

Marc Reichelt || http://www.marcreichelt.de/

--
DPRINTK("Last time you were disconnected, how about now?");
        linux-2.6.6/drivers/net/tokenring/ibmtr.c
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
  1. Mahlzeit Marc Reichelt,

    Nun möchte ich diesen Befehl also von Hand aufrufen:
    "Lösche alle Einträge von tabelle2, deren tabelle1_id nicht in tabelle1.id vorkommen"

    Sofern die von Dir verwendete SQLite-Version Subqueries unterstützt, könnte folgendes funktionieren:

    DELETE FROM tabelle2  
     WHERE tabelle1_id NOT IN (SELECT DISTINCT id FROM tabelle1)
    

    Welches ist die eleganteste Methode, um diesen Befehl auszuführen?

    Ob das "elegant" ist, kann und mag ich nicht beurteilen ... :-)

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo EKKi,

      Sofern die von Dir verwendete SQLite-Version Subqueries unterstützt, könnte folgendes funktionieren:

      DELETE FROM tabelle2

      WHERE tabelle1_id NOT IN (SELECT DISTINCT id FROM tabelle1)

        
      Sehr gut, das funktioniert! Ja, die SQLite-Version unterstützt immerhin Subqueries.  
        
      Eine Frage dazu habe ich noch: Da "id" ein Primärschlüssel ist, der immer eindeutig ist, könnte man da nicht stattdessen auch einfacher  
        `DELETE FROM tabelle2 WHERE tabelle1_id NOT IN (SELECT id FROM tabelle1)`{:.language-sql}  
      schreiben?  
        
        
      Vielen Dank & freundliche Grüße  
        
      Marc Reichelt || <http://www.marcreichelt.de/>  
      
      -- 
      DPRINTK("Last time you were disconnected, how about now?");  
              linux-2.6.6/drivers/net/tokenring/ibmtr.c  
        
      [Selfcode](http://emmanuel.dammerer.at/selfcode.html): ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
      
      1. Hallo Marc,

        Eine Frage dazu habe ich noch: Da "id" ein Primärschlüssel ist, der immer eindeutig ist, könnte man da nicht stattdessen auch einfacher
          DELETE FROM tabelle2 WHERE tabelle1_id NOT IN (SELECT id FROM tabelle1)
        schreiben?

        auch wenn "id" nicht eindeutig wäre, könnte man es so schreiben, müsste eventuell etwas längere Ausführungszeiten in Kauf nehmen.

        Freundliche Grüße

        Vinzenz