3

KEYと の 3 つの列を持つテーブルがありますVALUELAST_UPDATED

重複するVALUEフィールドがあります。最近更新された行を除いVALUEて、他の行と同じ行をすべて削除したい。

したがって、テーブルにこれらの行が含まれている場合:

1, "A", 2013-11-08
2, "B", 2013-10-30
3, "A", 2013-11-07
4, "A", 2013-11-01
5, "B", 2013-11-01

次に、これらの行だけを保持したい:

1, "A", 2013-11-08
5, "B", 2013-11-01

SQLでこれをどのように行うことができますか? DELETE FROM table WHERE key IN (SELECT key FROM table GROUP BY value HAVING count(*)>1)重複する値から単一のランダム(?)行を​​削除すると思いますが、最近更新された行以外をすべて削除するにはどうすればよいですか?

4

2 に答える 2

3

このようなものが動作するはずです:

DELETE t FROM myTable t
INNER JOIN
(
 SELECT VALUE,MAX(LAST_UPDATED) as mostRecent 
 FROM myTable 
 GROUP BY VALUE
 HAVING COUNT(*) > 1           
) t2 ON t.VALUE = t2.VALUE 
     AND t.LAST_UPDATED != t2.mostRecent;
于 2013-11-08T14:52:29.740 に答える
3

左結合でこれを行うことができます:

DELETE t
FROM table t
LEFT JOIN table t2 ON t.value = t2.value
AND t2.last_updated > t.last_updated
WHERE t2.key IS NOT NULL

これは、すべての行について、より新しい更新日を持つ別の行を探すことを意味します。ある場合、その行は削除されます。信頼性が高いため、日付の比較に「より大きい」を使用する代わりに、日付の差分を確認する必要がある場合があります。

この場合、左結合のパフォーマンスは、インライン テーブルを作成して結合するよりもはるかに優れていると予想されますが、パフォーマンスが問題になる場合は、両方の方法を試して、最も一貫して最高のパフォーマンスを発揮する方法を選択することをお勧めします。

于 2013-11-08T14:55:04.533 に答える