欲望输出是:
我想从一个组中删除表中的重复项。
我的桌子:
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 |
+----------------+-------------+----------------------+
答案 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