Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从Oracle表中删除除最旧记录以外的所有重复记录_Sql_Oracle - Fatal编程技术网

Sql 从Oracle表中删除除最旧记录以外的所有重复记录

Sql 从Oracle表中删除除最旧记录以外的所有重复记录,sql,oracle,Sql,Oracle,我有两个表,一个父表A和一个子表B。TableB有一个或多个记录,其中有一个父记录在TableA中。我需要删除表B中的所有记录,但最早日期除外,即表B中的所有副本。我不认为TableA需要包含在声明中,但我将其包括在内仅供参考 TableA _______ SecID, SecName 1, Sec1 2, Sec2 3, Sec3 4, Sec4 TableB _________ IncID, SecID, PayDate 16, 1,

我有两个表,一个父表A和一个子表B。TableB有一个或多个记录,其中有一个父记录在TableA中。我需要删除表B中的所有记录,但最早日期除外,即表B中的所有副本。我不认为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 )
)

您可以使用ROWID和analytics:

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
桌子

删除除一条记录外的所有重复记录

从rowid所在的表a中删除
这将获得所有唯一的rowid,除了这些rowid-s之外,sql将删除所有行。

您好,谢谢您的回复。我尝试了半联接,它看起来应该可以工作,但它保留的是最新的记录,而不是最旧的。@Ciaran:你说得对,我没有检查结果。我已经更新了我的答案,现在应该可以了。这是我要干杯的原因。知道为什么我的原始查询不起作用吗?@Ciaran:你需要指定要删除的secID,可能类似于从TableB中删除secID,PayDate不在SELECT secID中,MINPayDate FROM TableB GROUP BY secIDwell发现了这一点,你的上述查询都返回相同的结果..干杯
 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 your_table a
where a.rowid not in 
(
  select max(b.rowid) from your_table b
  group by b.col1,b.col2....b.coln
)