2017-08-17 9 views
4

Ich muss einen bestimmten Datensatz aus der Datenbanktabelle löschen, aber die Tabelle selbst hat keinen Primärschlüssel. Also Bedingung hängt von anderer Tabelle ab. Also, was ist der richtige Weg?Datensätze aus einer Tabelle ohne Primärschlüssel löschen

delete from table_1 
    where exists 
     (select distinct tb.* 
      from table_1 tb, table_2 tb_2, table_3 tb_3 
      where tb1.col = tb2.col 
      and tb3.col = tb2.col 
      and tb3.col_2= 10) 

ist der richtige Weg das zu tun? Nehmen wir an, Tabelle_1 hat 4 Spalten und die ersten zwei Spalten sollten die zu entfernenden Kriterien sein.

+1

Es ist der richtige Ansatz. Ich empfehle, zunächst eine Auswahlabfrage auszuführen und zu überprüfen, ob die zurückgegebenen Datensätze tatsächlich die Datensätze sind, die Sie löschen möchten. –

+2

Sie müssen die Unterabfrage korrelieren. Wie geschrieben, wenn eine einzelne Zeile von der Unterabfrage zurückgegeben wird, werden alle Zeilen in 'table_1' gelöscht. –

Antwort

2

Wenn die ausgewählte Version Ihrer Abfrage die Ergebnisse zurückgibt, die Sie löschen möchten, dann sind Sie gut. Ein paar Sachen obwohl ..

Verwenden Sie die ANSI-konforme explizite Join-Syntax anstelle der Komma skizziert, implizite Syntax (die seit langem abgeschrieben ist). Die explizite Syntax sieht besser aus und ist sowieso leichter zu lesen.

Korrelieren Sie Ihre EXISTS zurück mit der Haupttabelle. Und Sie brauchen kein distinct, es wird positiv zurückkommen, ob es 1 übereinstimmende Zeile oder 10 Milliarden gibt.

SELECT * 
FROM table_1 tb_1 
WHERE EXISTS (SELECT * 
       FROM table_2 tb_2 
       JOIN table_3 tb_3 ON tb_2.col = tb_3.col 
       WHERE tb_1.col = tb_2.col 
       AND tb_3.col_2 = 10) 
Verwandte Themen