Oracle:使用连接从表中删除组中的重复项

时间:2018-03-16 08:36:39

标签: sql oracle

欲望输出是:

我想从一个组中删除表中的重复项。

我的桌子:

rc_document:

+----------------+-------------+----------------------+
| rc_document_id | document_id | rc_document_group_id |
+----------------+-------------+----------------------+
|              1 |           1 |                    1 |
|              2 |           2 |                    1 |
|              3 |           3 |                    1 |
|              4 |           4 |                    1 |
|              5 |           1 |                    2 |
|              6 |           3 |                    2 |
+----------------+-------------+----------------------+

rc_document_group:

+----------------------+----------+
| rc_document_group_id | priority |
+----------------------+----------+
|                    1 |        1 |
|                    2 |        2 |
+----------------------+----------+

我只想保留rc_document_group具有最高优先级的rc_documents。应删除具有相同“document_id”的所有其他条目。 换句话说...... document_id应该只在具有最高优先级的rc_document_group中,其他的应该被删除

这是我的预期结果:

+----------------+-------------+----------------------+
| rc_document_id | document_id | rc_document_group_id |
+----------------+-------------+----------------------+
|              2 |           2 |                    1 |
|              4 |           4 |                    1 |
|              5 |           1 |                    2 |
|              6 |           3 |                    2 |
+----------------+-------------+----------------------+

4 个答案:

答案 0 :(得分:1)

使用Oracle KEEP LAST查找每rc_document_id个最佳document_id。然后删除所有其他人。

delete from rc_document
where rc_document_id not in
(
  select max(d.rc_document_id) keep (dense_rank last order by dg.priority)
  from rc_document d
  join rc_document_group dg using (rc_document_group_id)
  group by d.document_id
);

Rextester演示:http://rextester.com/NZVZGF52818

答案 1 :(得分:0)

  

进行独特选择

     SELECT MAX(rd.rc_document_id),rd.document_id,
     rd.rc_document_group_id
     FROM rc_document rd 
     INNER JOIN rc_document_group rdg ON   
     rd.rc_document_group_id = rdg.rc_document_group_id
     GROUP BY rd.document_id,rd.rc_document_group_id ;
  

要删除,请运行此查询

     DELETE FROM rc_document WHERE rc_document_id NOT IN (
     SELECT MAX(rd.rc_document_id)
     FROM rc_document rd 
     INNER JOIN rc_document_group rdg ON   
     rd.rc_document_group_id = rdg.rc_document_group_id
     GROUP BY rd.document_id,rd.rc_document_group_id);

答案 2 :(得分:0)

您可以使用not exists检查记录是否具有最高优先级。

SELECT
    *
FROM
    rc_document rc,
    rc_document_group rcg
WHERE
    NOT EXISTS (
        SELECT
            1
        FROM
            rc_document rcsub,
            rc_document_group rcgsub
        WHERE
            rc.documetn_id == rcsub.document_id
        AND rc.rc_document_id != rcsub.rc_document_id
        AND rc.priority < rcsub.priority
    )

答案 3 :(得分:0)

使用row_number窗口功能

select *
from (
  select *, row_number() over (partition by document_id order by priority desc) rn
  from rc_document d
  join rc_document_group dg on d.rc_document_group_id  = dg.rc_document_group_id 
) t
where t.rn = 1