SQL Server - Delete table rows by Subqueries

一般我們在刪除資料表的資料時,通常為篩選該primary keys來刪除資料。在這邊主要是要提

到透過子查詢的方式來刪除符合查詢條件的資料列。

SQL語法使用環境為:SQL Server 2008 R2

在這邊會帶到兩個TABLES

首先有一table 為income_record,在這邊設定為要刪除資料的資料表

income_record

另一table為income_idinfos,記錄了ID的代號及名稱,設定為參考的table

income_idinfos

首先,我們要做的事為假設income_record存在的ID資料在income_idinfos不存在的話,

就將income_record相關的資料給刪除掉! 以上面的例子來說,s003在idinfos不存在,則就

必須將7, 8, 9這三列給刪除掉囉!

方法一:

delete A from income_record A, ( 
 select d.* from( 
  select r.*,info.id as id_t from income_record r
  left join (
   select id from income_idinfos
  ) info on (info.ID = r.ID)
 )d where d.id_t is null
)B
where A.ID = B.ID;

這個子查詢的方式包含三層,以最裡面的那一層來說。首先,撈出record的資料是以left join

idinfos的方式(ID = ID),因此會得到以下的結果:


因為是做left join,因此若idinfos與record比對不到的話,該idinfos會以NULL值與record一起

帶出。

接著,於最外層要做delete語法時,在A table與B table inner join之下,以篩選出B table含有

此NULL值的列來當作要刪除A相關資料列的依據,達到目的。

方法二:

delete from income_record 
where not exists ( 
    select * from income_idinfos where income_idinfos.ID = income_record.ID
)

這個方法是透過not exists語法直接刪除子查詢所查詢出來的資料。

總結:

感覺方法一雖然在語法使用上比較複雜,但是其所包含的技巧算是需具有基本功。而方法二

透過not exists來達到目的在語法使用上很簡潔,但如果沒想到這個語法的話,方法一也不失

為一個訓練基本功的方式。

留言