📜  从 SQL 表中删除重复行(基于多列中的值)

📅  最后修改于: 2022-05-13 01:55:25.568000             🧑  作者: Mango

从 SQL 表中删除重复行(基于多列中的值)

在 SQL 中,某些行在多列 (>1) 中包含重复条目。为了删除这些行,我们需要使用DELETE关键字以及自连接表。下图也一样。对于本文,我们将使用 Microsoft SQL Server 作为我们的数据库。

第 1 步:创建数据库。为此,请使用以下命令创建一个名为 GeeksForGeeks 的数据库。

询问:

CREATE DATABASE GeeksForGeeks

输出:

第 2 步:使用 GeeksForGeeks 数据库。为此,请使用以下命令。

询问:

USE GeeksForGeeks

输出:

第 3 步:在 GeeksForGeeks 数据库中创建一个表 RESULT。该表有 5 列,即 STUDENT_ID、PHYSICS_MARKS、CHEMICSRY_MARKS、MATHS_MARKS 和 TOTAL_MARKS,其中包含学生的 id、他/她在物理、化学和数学方面的成绩,最后是他/她的总成绩。

询问:

CREATE TABLE RESULT(
STUDENT_ID  INT,
PHYSICS_MARKS INT,
CHEMISTRY_MARKS INT,
MATHS_MARKS INT,
TOTAL_MARKS INT);

输出:

第 4 步:描述表 RESULT 的结构。

询问:

EXEC SP_COLUMNS RESULT;

输出:

第 5 步:在 RESULT 表中插入 10 行。

询问:

INSERT INTO RESULT VALUES(1,90,88,75,253);
INSERT INTO RESULT VALUES(2,99,88,75,262);
INSERT INTO RESULT VALUES(3,96,88,75,256);
INSERT INTO RESULT VALUES(4,97,87,76,260);
INSERT INTO RESULT VALUES(5,91,86,77,254);
INSERT INTO RESULT VALUES(6,92,85,78,255);
INSERT INTO RESULT VALUES(7,93,84,79,256);
INSERT INTO RESULT VALUES(8,80,83,87,250);
INSERT INTO RESULT VALUES(9,80,82,88,250);
INSERT INTO RESULT VALUES(10,80,81,89,250);

输出:

步骤 6:显示 RESULT 表的所有行。

询问:

SELECT * FROM RESULT;

输出:

第 7 步:从表RESULT中删除在CHEMISTRY_MARKSMATHS_MARKS列中有重复条目的行。为了实现这一点,我们使用DELETE函数通过自连接(在表的 2 个别名上使用JOIN函数,即R1R2 )表与自身并比较列CHEMISTRY_MARKSMATHS_MARKS的条目以获取列STUDENT_ID的不同条目,因为 ID对每个学生来说都是独一无二的。

句法:

DELETE T1 FROM TABLE_NAME T1
JOIN TABLE_NAME T2
ON T1.COLUMN_NAME2 = T2.COLUMN_NAME2 AND
T1.COLUMN_NAME3 = T2.COLUMN_NAME3 AND .......
AND T2.COLUMN_NAME1 < T1.COLUMN_NAME1;

询问:

DELETE R1 FROM RESULT R1
JOIN RESULT R2
ON R1.CHEMISTRY_MARKS = R2.CHEMISTRY_MARKS
AND R1.MATHS_MARKS = R2.MATHS_MARKS
AND R2.STUDENT_ID < R1.STUDENT_ID;

输出:

第 8 步:显示更新后的RESULT表的所有行。

询问:

SELECT * FROM RESULT;

注意: CHEMISTRY_MARKSMATHS_MARKS列中没有行有重复条目。

输出:

第 9 步:从表RESULT中删除在TOTAL_MARKSPHYSICS_MARKS列中有重复条目的行。

询问:

DELETE R1 FROM RESULT R1
JOIN RESULT R2
ON R1.TOTAL_MARKS = R2.TOTAL_MARKS AND R1.PHYSICS_MARKS = R2.PHYSICS_MARKS
AND R2.STUDENT_ID < R1.STUDENT_ID;

输出:

第 10 步:显示更新后的RESULT表的所有行。

询问:

SELECT * FROM RESULT;

注意TOTAL_MARKSPHYSICS_MARKS列中没有行有重复条目。

输出: