更多: 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”。

  1. 使用 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
  1. 使用相关子查询删除重复记录

即使使用相关子查询,用户也可以找到重复项,例如:

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));
  1. 使用分析功能删除重复项:

用户甚至可以使用如下分析函数找到重复项:

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);
oracle 如何从表中删除重复记录

因此,首先,我们将创建一个表并其中插入一些记录。
然后我们将编写一个查询来删除表中的重复记录。
在本文中,我们将介绍一个使用三种不同技术从表中删除重复记录的示例,如使用 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