web-dev-qa-db-ja.com

SQLite3:重複を削除する

次の表を考える

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)
);

addressbodyが同じであるすべての行を削除したいのですが。つまり、addressbodyに基づいて重複を排除し、最初の出現のみを残します。

4
Gaia

内容が似ている2つの行を明確にしたい場合は、SQLite3の [〜#〜] rowid [〜#〜] 機能を使用できます。これは、テーブルの各行を一意に識別するのに役立ちます。

このようなもの:

DELETE FROM sms WHERE rowid NOT IN (SELECT min(rowid) FROM sms GROUP BY address, body);

テーブルでその行が最初に出現する最小のROWIDを持つ行を取得するように機能するはずです。

ただし、トランザクションでこれを実行することを忘れないでください。トランザクションが意図したとおりに機能することを確認してください。もちろん、事前にバックアップを取ってください。 =)

11
Kassandry