2017-08-17 58 views
4

我需要從數據庫表中刪除一些特定的記錄,但表本身沒有主鍵。所以條件取決於其他表。那麼,正確的方法是什麼?刪除沒有主鍵的表中的記錄

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) 

是正確的方法嗎?可以說,table_1有4列,前兩列應該是要刪除的條件。

+1

這是正確的做法。我建議先運行一個選擇查詢並驗證返回的記錄確實是你想要刪除的記錄。 –

+2

您需要關聯子查詢。如果子查詢返回單個行,那麼'table_1'中的所有行都將被刪除。 –

回答

2

如果選擇版本的查詢返回想要刪除的結果,那麼你很好。儘管如此,一些事情......

使用符合ANSI的顯式連接語法而不是逗號描述的隱式語法(這是自折舊後的很長時間)。無論如何,顯式語法看起來更好,並且更容易閱讀。

將您的EXISTS關聯回主表。而且你不需要一個明確的,無論是匹配的行還是100億,它都會返回正值。

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)