Sql Oracle如何基于多个数据库列和条件删除重复项

Sql Oracle如何基于多个数据库列和条件删除重复项,sql,oracle,Sql,Oracle,我有一个很大的表格,里面有从多个系统收集的数据。我现在必须根据条件和多列删除重复记录 以下是一个例子: +---------------+-------------+------+-----+-------- | System ID | Debt Num | Exp Dt | Account NO | +---------------+-------------+------+-----+--------- | pay | 2222 | 0114

我有一个很大的表格,里面有从多个系统收集的数据。我现在必须根据条件和多列删除重复记录

以下是一个例子:

 +---------------+-------------+------+-----+--------
| System ID     | Debt Num    | Exp Dt | Account NO |
+---------------+-------------+------+-----+---------
| pay           | 2222        | 0114   |   111      |
| pay           | 2222        | 0214   |   111      |
| Online        | 2222        | 0214   |   111      |
| Online        | 3333        | 0115   |   222      |
| Online        | 3333        | 0116   |   222      |
| ERP           | 2222        | 0214   |   111      | 
| ERP           | 4444        | 0114   |   333      | 
+---------------+-------------+------+-----+--------
从上述数据中,删除满足以下条件的重复项

删除按借方编号、exp dt、账号分组的重复行,并使用maxexp dt保留一条记录。 保留的记录优先于系统ID。1在线支付2和3 ERP。在上述账户111中,我们有所有三个系统的记录,借记卡的maxexp dt是所有三个系统的0214。仅应保留exp dt=0214的Pay记录,其余记录应删除。 正如上面关于账户222的例子,我们没有pay的记录,因此优先考虑在线系统和ERP,其中应保留maxexp dt。 我尝试过网上的多个查询,比如group by、row_number,但都只满足一个条件

感谢您的帮助,提出您的想法和建议

编辑:
Gordon的查询工作正常,符合我的要求,但是当我在包含540K行的登台上运行相同的查询时,它会出错ORA-00600内部错误。

我认为您可以使用rowid和相关子查询执行此操作:

delete from payinfo_staging_db
   where rowid <> (select rowid
                   from (select rowid
                         from payinfo_staging_db t2
                         where t2.debitNum = payinfo_staging_db.debitNum and
                               t2.accountNo = payinfo_staging_db.accountNo
                         order by t2.exp_dt,
                                  (case when t2.SystemId = 'Pay' then 1
                                        when t2.SystemId = 'Online' then 2
                                        when t2.SystemId = 'ERP' then 3
                                   end)
                        ) r
                    where rownum = 1
                  );
编辑:

Oracle中的嵌套引用一定有问题。以下内容至少在正确解析和执行的意义上起作用:

delete from payinfo_staging_db
   where rowid <> (select min(rowid) keep (dense_rank first order by exp_dt desc,
                                                            (case when t2.SystemId = 'Pay' then 1
                                                                  when t2.SystemId = 'Online' then 2
                                                                  when t2.SystemId = 'ERP' then 3
                                                             end)
                                          ) as therowid
                   from payinfo_staging_db t2
                   where t2.debitNum = payinfo_staging_db.debitNum and
                         t2.accountNo = payinfo_staging_db.accountNo
                  );

SQL FIDLE是。

您研究过Oracle合并命令吗?@scraatz直到现在都没有。我刚刚看了一个例子`匹配时合并到。。当不匹配时。这是正确的吗?你有更好的参考资料吗?顺便说一句,好主意,好建议。我会试试的。对不起,我只是最近在解决类似问题时才发现的。我在Google上搜索了oracle从联接中删除,就像在其他数据库上一样,您可以从联接表中删除,这在oracle上是不可能的。我尝试了上述操作,并注意到错误t.debitNum:标识无效。表别名t在子查询中有效吗?表的名称是什么?我的表名是payinfo_staging_db,我将t替换为payinfo_staging_db t,与t t2中的payinfo_staging_db t2相同。希望这是正确的。我现在看到编辑,我已经试过了。相同错误ORA-00904.payinfo\u staging\u db:debitNum无效标识符。@dicaprio。这将选择一行,第一行基于order by。日期的第一个子句获取最近的日期。然后由系统根据您的偏好进行订购。