📜  在具有多个主键的 SQL 上删除 double - SQL (1)

📅  最后修改于: 2023-12-03 15:37:40.165000             🧑  作者: Mango

在具有多个主键的 SQL 上删除 double - SQL

在具有多个主键的 SQL 中,要删除重复的行需要特别小心。因为相同的列值可能只有部分是重复的,这就需要用到多个主键来确定唯一的行。在这种情况下,我们不能简单地使用 DISTINCT 来删除重复的行,而应该使用 GROUP BYHAVING COUNT(*) > 1 语句来找出重复的组合,并删除其中的行。

删除具有两个主键的 SQL

假设我们有一个具有两个主键的表 mytable,它包含以下数据:

| id | name | age | | --- | --- | --- | | 1 | Alice | 25 | | 2 | Bob | 30 | | 3 | Charlie | 25 | | 4 | Alice | 30 | | 5 | Bob | 25 |

我们要从这个表中删除重复的行,也就是说,删除其中 nameage 列都相同的行。我们可以使用以下 SQL 语句:

DELETE FROM mytable
WHERE (name, age) IN (
  SELECT name, age
  FROM mytable
  GROUP BY name, age
  HAVING COUNT(*) > 1
);

这个 SQL 语句使用了一个子查询来查找重复的组合。首先,它使用 GROUP BY 语句将表按 nameage 列分组,然后使用 HAVING COUNT(*) > 1 语句来找出重复的组合。IN 子句会把这些重复的组合传递给 DELETE 语句,它会删掉在这些重复的组合中出现过的行。

删除具有三个或更多主键的 SQL

如果我们有一个具有三个或更多主键的表 mytable,我们需要在上述 SQL 语句中添加更多的列名。例如,如果表中包含了以下数据:

| id | name | age | gender | | --- | --- | --- | --- | | 1 | Alice | 25 | F | | 2 | Bob | 30 | M | | 3 | Charlie | 25 | M | | 4 | Alice | 30 | F | | 5 | Bob | 25 | M |

我们可以使用以下 SQL 语句来删除具有重复组合的行(在这个例子中,我们删除所有 nameagegender 都相同的行):

DELETE FROM mytable
WHERE (name, age, gender) IN (
  SELECT name, age, gender 
  FROM mytable 
  GROUP BY name, age, gender 
  HAVING COUNT(*) > 1
);
结论

在具有多个主键的 SQL 中删除重复的行是一项非常有挑战性的任务。它要求我们使用多个主键来确定唯一的行,然后使用 GROUP BY 语句和 HAVING COUNT(*) > 1 语句来找出重复的组合。这些组合可以传递给 DELETE 语句,它将删掉在这些组合中出现过的所有行。