PostgreSql中使用ctid去重
最近的開發中使用PostgreSql時也遇到了去重的問題,開始的時候確實一籌莫展,不像Oracle有rowid這樣的欄位(是因為我不知道pg中也有類似的欄位),因此就在文件中找類似的欄位,於是想起了幾個系統欄位來,這邊著重就看解決問題的ctid。
ctid是一個表中物理上確認版本的欄位,這是個系統欄位,只要表中存在資料那麼就會存在這個欄位,與oid不同。要想使用OID,建立表時應該帶上with oid。
在一個表中ctid是唯一的,那麼就符合了去重的先決條件。於是,在下面的情況下,
"ctid""id""name_1""name_2""name_3"
"(0,133)""3"
"name_13""name_23""name4444"
"(1,119)""3"
"name_13""name_23""name4444"
很明顯兩條資料一樣,只需要保留一條。那麼就得這樣做,
select * from mytest6 where ctid in (
select min(ctid) from mytest6 where id = 3);
當然這是知道只有id=3時會出現這樣的情況,假如不止這一條,那麼就得這麼做,
select * from mytest where ctid in (
select min(ctid) from mytest group by id);
寫法可以很多,也可以不用in,而使用表關聯。但是大致的解決思路就是這樣。