我需要一个SQL-Query来删除表中的重复项。让我们从我的表开始
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 |
+----------------+-------------+----------------------+
(document_id can be exists in mulitple rc_document-group´s)
rc_document_group :
+----------------------+----------+
| rc_document_group_id | priority |
+----------------------+----------+
| 1 | 1 |
| 2 | 2 |
+----------------------+----------+
每个rc_document都可以与rc_document_group连接。在rc_document_group中是每个rc_document的优先级。
我想删除rc_document行,其中document_id在rc_document_group中没有最高优先级。因为document_id可以存在于多个rc_document-group中..我只想保留那个,具有最高优先级。
这是我删除重复的document_id后的预期rc_document表:
+----------------+-------------+----------------------+
| rc_document_id | document_id | rc_document_group_id |
+----------------+-------------+----------------------+
| 2 | 2 | 1 |
| 4 | 4 | 1 |
| 5 | 1 | 2 |
| 6 | 3 | 2 |
+----------------+-------------+----------------------+
必须删除带有rc_document_id 1和3的rc_document,因为document_id 1和3位于另一个具有更高优先级的rc_document_group中。
我是sql中的新手,我不知道如何编写这些sql查询...谢谢你的帮助!!
答案 0 :(得分:1)
首先,您可以加入这两个表,以便在每一行上获得相应的优先级。之后,您可以使用分析函数MAX()为每一行获取每个document_id组中的最大优先级。此时,您将过滤掉优先级不等于组中最大优先级的行。
尝试此查询:
SELECT t.rc_document_id,
t.document_id,
t.rc_document_group_id
FROM (SELECT d.*,
g.priority,
MAX(g.priority) OVER(PARTITION BY document_id) max_priority
FROM rc_document d
INNER JOIN rc_document_group g
ON d.rc_document_group_id = g.rc_document_group_id) t
WHERE t.priority = t.max_priority