Entfernen aller Datensätze aus einer Tabelle, die nicht in einer anderen Tabelle vorhanden sind

8

Ich habe eine Tabelle mit vielen (& gt; 20.000) Aufzeichnungen. Es ist an der Zeit, diese ein wenig zu säubern, da Anfragen dazu führen, dass viele Ressourcen genutzt werden. Ich habe eine andere (temporäre) Tabelle mit recent Aufzeichnungen. Alle Datensätze in der ersten Tabelle, die im zweiten nicht existieren, können gehen. Allerdings muss ich wegen einiger Joins die ID für die letzten Datensätze behalten, damit ich nicht einfach TRUNCATE und dann die Tabelle kopieren kann. Gibt es eine Möglichkeit, dies zu tun?

    
Tim van Dalen 04.11.2010, 10:22
quelle

2 Antworten

14
%Vor%

Bearbeiten:
id NOT IN (SELECT id FROM temp_table) ist eine lausige Konstruktion. Wenn Sie große Tabellen haben und Ihre Servereinstellungen auf wenig Speicher abgestimmt sind, werden Sie dies für immer ausführen.

@Piskvor Die Antwort ist eine längere, aber eine viel bessere Abfrage, die am besten bei Setups mit wenig Arbeitsspeicher funktioniert. Und wenn ich "wenig Speicher" sage, meine ich Datenbankserver, die keinen vollen High-End-Computer aufnehmen, also so ziemlich jedes System, das eine kleine Business-Website oder ähnliches verwaltet.

    
AlexanderMP 04.11.2010, 10:25
quelle
4

Dies gibt Ihnen die id s von Zeilen, die keine entsprechende Zeile haben (mit recordid Spalte übereinstimmen - Ihre können anders sein) in der anderen Tabelle:

%Vor%

Damit können Sie prüfen, ob Sie tatsächlich die richtigen Zeilen zum Löschen auswählen. Dann stecken Sie es in ein DELETE:

%Vor%     
Piskvor 04.11.2010 10:26
quelle

Tags und Links