更多: zhilu jiaocheng
STEP 2 在表中插入一些记录
-- insert some records with duplicates in the table INSERT ALL INTO COUNTRY_MAS VALUES(100,'Netherlands') INTO COUNTRY_MAS VALUES(101,'UK') INTO COUNTRY_MAS VALUES(102,'USA') INTO COUNTRY_MAS VALUES(103,'KSA') INTO COUNTRY_MAS VALUES(100,'Netherlands') INTO COUNTRY_MAS VALUES(104,'UAE') INTO COUNTRY_MAS VALUES(101,'UK') INTO COUNTRY_MAS VALUES(105,'CANADA') INTO COUNTRY_MAS VALUES(106,'GERMANY') SELECT * FROM DUAL; COMMIT;
其中:如果 country_name 列数据重复,我会将记录视为重复记录。
现在,如我们所见,我们有两条 COUNTRY_NAME 的记录,分别为“Netherlands”和“UK”。
- 使用 GROUP BY 和 HAVING CLAUSE 删除重复记录
因此,我们将编写一个查询以使用 GROUP BY 和 HAVING 子句查找重复项。
SELECT COUNTRY_NAME, COUNT(1) FROM COUNTRY_MAS GROUP BY COUNTRY_NAME; --- OUTPUT COUNTRY_NAME COUNT(1) ---------------------------------- GERMANY 1 USA 1 CANADA 1 Netherlands 2 UAE 1 UK 2 KSA 1
现在,我们知道对于 COUNTRY_NAME,例如 'UK' 和 'Netherlands',count(1) 是 2,这意味着它们在表中出现了两次。
所以现在我们可以获取所有 count(1) > 1 的记录并将它们放入 IN 子句中并删除它们,如下所示:
DELETE FROM COUNTRY_NAME WHERE COUNTRY_NAME IN ('UK','Netherlands');
如果你想让游戏更上一层楼,我们可以将所有重复记录的 ROWID 定位并删除,而不是手动在 IN 子句中写入 COUNTRY_NAME,我们要做的是将 MIN(ROWID)对于所有唯一的 COUNTRY_NAME 记录。
SELECT MIN(ROWID) FROM COUNTRY_MAS GROUP BY COUNTRY_NAME; -- output ROWID ----------- AAAU3NAAEAAAAndAAI AAAU3NAAEAAAAndAAC AAAU3NAAEAAAAndAAH AAAU3NAAEAAAAndAAA AAAU3NAAEAAAAndAAF AAAU3NAAEAAAAndAAB AAAU3NAAEAAAAndAAD
如我们所见,我们得到了 7 个 rowid,每个记录一个(表中有 9 个记录)。
现在我们可以从表中删除所有另外的记录,如下所示:
DELETE FROM COUNTRY_MAS WHERE ROWID NOT IN ( SELECT MIN(ROWID) FROM COUNTRY_MAS GROUP BY COUNTRY_NAME); -- 2 records deleted
- 使用相关子查询删除重复记录
即使使用相关子查询,用户也可以找到重复项,例如:
SELECT COUNTRY_NAME FROM COUNTRY_MAS C2 WHERE ROWID IN ( SELECT MIN(ROWID) FROM COUNTRY_MAS C1 WHERE C1.COUNTRY_NAME = C2.COUNTRY_NAME);
现在删除重复项:
DELETE FROM COUNTRY_MAS WHERE ROWID NOT IN ( SELECT ROWID FROM COUNTRY_MAS CM WHERE ROWID IN ( SELECT MIN(ROWID) FROM COUNTRY_MAS C WHERE CM.COUNTRY_ID = C.COUNTRY_ID AND CM.COUNTRY_NAME = C.COUNTRY_NAME));
- 使用分析功能删除重复项:
用户甚至可以使用如下分析函数找到重复项:
SELECT ROWID FROM ( SELECT ROWID, ROW_NUMBER() OVER(PARTITION BY COUNTRY_ID, COUNTRY_NAME ORDER BY COUNTRY_ID) RANK FROM COUNTRY_MAS) WHERE RANK=2;
现在删除重复项:
DELETE FROM COUNTRY_MAS WHERE ROWID IN ( SELECT ROWID FROM ( SELECT ROWID, ROW_NUMBER() OVER(PARTITION BY COUNTRY_ID, COUNTRY_NAME ORDER BY COUNTRY_ID) RANK FROM COUNTRY_MAS) WHERE RANK=2);
因此,首先,我们将创建一个表并其中插入一些记录。
然后我们将编写一个查询来删除表中的重复记录。
在本文中,我们将介绍一个使用三种不同技术从表中删除重复记录的示例,如使用 GROUP BY 和 HAVING,分析函数如 row_number,以及使用相关子查询的第三种技术。
读者可以决定他对工作的满意方式。
他们删除重复记录的关键在于以下3个步骤:
- 确定主键(我们将如何考虑记录重复,如果重复,哪些列数据将被视为重复)
- 查找重复记录
- 使用 rowid 删除它们
那么让我们开始吧。
步骤 1:创建表
让我们先创建一个虚拟表:
-- Create table CREATE TABLE COUNTRY_MAS ( COUNTRY_ID NUMBER, COUNTRY_NAME VARCHAR2(50) );
日期:2020-09-17 00:11:30 来源:oir作者:oir