一般我們在刪除資料表的資料時,通常為篩選該primary keys來刪除資料。在這邊主要是要提
到透過子查詢的方式來刪除符合查詢條件的資料列。
SQL語法使用環境為:SQL Server 2008 R2
在這邊會帶到兩個TABLES
首先有一table 為income_record,在這邊設定為要刪除資料的資料表
這個子查詢的方式包含三層,以最裡面的那一層來說。首先,撈出record的資料是以left join
idinfos的方式(ID = ID),因此會得到以下的結果:
這個方法是透過not exists語法直接刪除子查詢所查詢出來的資料。
總結:
感覺方法一雖然在語法使用上比較複雜,但是其所包含的技巧算是需具有基本功。而方法二
透過not exists來達到目的在語法使用上很簡潔,但如果沒想到這個語法的話,方法一也不失
為一個訓練基本功的方式。
到透過子查詢的方式來刪除符合查詢條件的資料列。
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來達到目的在語法使用上很簡潔,但如果沒想到這個語法的話,方法一也不失
為一個訓練基本功的方式。
留言
張貼留言