次の表を考える
CREATE TABLE `sms` (
`_id` INTEGER,
`thread_id` INTEGER,
`address` TEXT,
`person` INTEGER,
`date` INTEGER,
`protocol` INTEGER,
`read` INTEGER DEFAULT 0,
`status` INTEGER DEFAULT -1,
`type` INTEGER,
`reply_path_present` INTEGER,
`subject` TEXT,
`body` TEXT,
`service_center` TEXT,
PRIMARY KEY(_id)
);
address
とbody
が同じであるすべての行を削除したいのですが。つまり、address
とbody
に基づいて重複を排除し、最初の出現のみを残します。
内容が似ている2つの行を明確にしたい場合は、SQLite3の [〜#〜] rowid [〜#〜] 機能を使用できます。これは、テーブルの各行を一意に識別するのに役立ちます。
このようなもの:
DELETE FROM sms WHERE rowid NOT IN (SELECT min(rowid) FROM sms GROUP BY address, body);
テーブルでその行が最初に出現する最小のROWIDを持つ行を取得するように機能するはずです。
ただし、トランザクションでこれを実行することを忘れないでください。トランザクションが意図したとおりに機能することを確認してください。もちろん、事前にバックアップを取ってください。 =)