我有2个表,一个父TableA和一个子TableB。 TableB具有一个或多个具有TableA中父记录的记录。除了最早的日期,即表B中的所有重复项,我需要删除TableB中的所有记录。我不认为TableA需要参与声明,但我将其包括在内仅供参考。
TableA
_______
SecID, SecName
1, Sec1
2, Sec2
3, Sec3
4, Sec4
TableB
_________
IncID, SecID, PayDate
16, 1, 11/03/2011
17, 1, 11/04/2011
18, 2, 10/01/2011
19, 3, 01/06/2011
20, 3, 01/09/2011
21, 3, 01/12/2011
22, 4, 10/06/2011
因此,在上面的表B中,我需要删除记录17,20和21,为每个SecID留下一条记录。到目前为止,我有下面但由于某种原因,它包括我想保留的最早的记录:
delete from TableB where PayDate not in (
select min(PayDate)from TableB
having ( count(PayDate) > 1 )
)
答案 0 :(得分:16)
您可以使用ROWID和分析:
SQL> DELETE FROM tableB
2 WHERE ROWID NOT IN
3 (SELECT first_value(ROWID)over(PARTITION BY secID ORDER BY paydate)
4 FROM tableB);
3 rows deleted
SQL> select * from tableB;
INCID SECID PAYDATE
---------- ---------- -----------
16 1 11/03/2011
18 2 10/01/2011
19 3 01/06/2011
22 4 10/06/2011
您还可以使用更传统的半连接:
SQL> DELETE FROM tableB b_out
2 WHERE EXISTS (SELECT NULL
3 FROM tableB b_in
4 WHERE b_in.secID = b_out.secID
5 AND b_in.paydate < b_out.paydate);
3 rows deleted
答案 1 :(得分:6)
表
ID RefCode Code_Desc
122 B122 The Notebook
122 B122 The Notebook
122 B122 The Notebook
123 B123 A Walk to Remember
123 B123 A Walk to Remember
123 B123 A Walk to Remember
123 B123 A Walk to Remember
删除除一个
以外的所有重复记录
delete from TABLE a where rowid<(select max(rowid) from TABLE b where a.ID = b.ID)
删除除一个
以外的特定重复记录
delete from TABLE a where rowid<(select max(rowid) from TABLE b where a.ID = b.ID and a.ID = 122)
答案 2 :(得分:0)
delete from your_table a
where a.rowid not in
(
select max(b.rowid) from your_table b
group by b.col1,b.col2....b.coln
)
这将获得所有 唯一 rowid,除了这些rowid-s之外,sql将删除所有行。