ich hoffe ihr könnt mir helfen, da ich gerade auf dem Schlauch stehe. Also ich habe 2 Tabellen. Beide Tabellen haben eine Spalte Produktnummer. In Tabelle1 stehen Datensätze mit einer Produktnummer, die auch in Tabelle2 vorkommt. Es sollen alle Datensätze aus Tabelle1 gelöscht werden, die in Tabelle2 nicht vorkommen. Beispiel:
Tabelle1
pnr text
123 dfhdjfh
536 fdhfjdhf
346 dhfjdhf
233 fdhfjh
--> Hier sollen also aus Tabelle1 die Datensätze mit der pnr 536 und 233 gelöscht werden.
So jetzt bin am grübeln wie ich das machen kann. Mein Gedanke ist zuerst ein Loop auf Tabelle1 zu machen. Innerhalb diesen Loops dann einen weiteren Loop auf Tabelle2 mit der bedingung where t1.pnr = t2.pnr
Jetzt ist aber das problem, dass ja mit dieser bedingung genau das gegenteil erreicht wird, weil ich ja die datensätze aus tabelle1 löschen will wo die pnr NICHT gleich der pnr aus tabelle2 ist. Aber eine bedingung t1.pnr <> t2.pnr macht ja keinen sinn.
Wisst ihr einen geschickten weg?
Falls es sich um Datenbanktabellen handelt, und uns nur die Einträge interessieren, für die in Tabelle 2 ein Eintrag existiert, funktioniert auch sehr schön ein INNER JOIN beim SELECT.
Moin,
wenn man alle Einträge einer Tabelle A haben möchte, die Nicht in Tabelle B enthalten sind, sollte man ein SUBQUERY einsetzen.
Beispiel:
in dem gezeigten Beispiel werden alle Einträge aus Tabelle Ztest3 in die interne Tabelle T1 abgelegt, die nicht in Ztest4 enthalten sind. viel Freude damit
gruß Tron
Folgende Benutzer bedankten sich beim Autor Tron für den Beitrag (Insgesamt 2): wreichelt • ostpower
<:: XING-Gruppe Tricktresor::> Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.
Hey super genau die gedankenhilfe hab ich gebraucht, aber ich hab jetzt noch ein kleines problem, wenn ich das so implementiere, dann kommt die fehlermeldung: "eine subquery darf keine into- oder order by-klausel..."
das ist ja blöd, dass ich kein into machen darf...
Moin,
falls du den geklammerten Select meinst,
der erfüllt lediglich den Zweck "Wahr oder Falsch" zu bestimmen (ist ja auch Bestandteil der Where-Klausel).
Die Daten für die Löschung sammelt der "äußere" Select.
In Deinem Fall :
data t1 type table of tabelle1.
Select * from tabelle1 as f into t1
where not exsists ( select * from tabelle2 where pnr = f~pnr and text = f~text ).
if not t1[] is inital.
DELETE tabelle1 FROM TABLE t1.
endif.
gruß Tron
<:: XING-Gruppe Tricktresor::> Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.