我需要SQL查询来删除表中的重复项。让我们从我的桌子开始
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组中。我只想保留那个,具有最高优先级。
这是我删除重复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 |
+----------------+-------------+----------------------+
必须删除具有 1 和 3 rc_document_id rc_document,因为document_id 1 和 3 位于另一个优先级更高的rc_document_group中。
我是SQL的新手,我不知道如何编写这些sql查询...感谢您的帮助!!
首先,您可以连接两个表,以便在每行上获得相应的优先级。之后,您可以使用分析函数 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