当前位置: 首页 > 面试题库 >

使用联接从表中删除重复的行

宗政学
2023-03-14
问题内容

我有两个表来包含国家/地区的州(state_table)和城市(city_table)

城市表具有state_id以便将其与state_table相关联

两个表中已经有数据。

现在的问题

城市表包含一个州内一个城市的多个条目。另一个城市可能也可能没有相同的城市名称

例如:cityone将在city表中使用stateone出现5次,使用statetwo出现2次

那么,我将如何编写查询以为每个州保留一个城市并删除其余城市?

模式如下

CREATE TABLE IF NOT EXISTS `city_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `state_id` int(11) NOT NULL,
  `city` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `state_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `state` varchar(15) NOT NULL,
  `country_id` smallint(5) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

这是样本数据

id   state_id   city
1   1   city_one
2   1   city_two
3   1   city_one
4   1   city_two
5   2   city_one
6   3   city_three
7   3   city_one
8   3   city_three
9   4   city_four
10  4   city_five

原始表格有152,451行


问题答案:

如果你想删除重复的城市,相同的state_id(重复记录),你可以做到这一点,通过将它们分组city,并state_id使用MINMAX功能:

在删除查询之前,您的表看起来像

| ID | STATE_ID |       CITY |
------------------------------
|  1 |        1 |   city_one |
|  2 |        1 |   city_two |
|  3 |        1 |   city_one |
|  4 |        1 |   city_two |
|  5 |        2 |   city_one |
|  6 |        3 | city_three |
|  7 |        3 |   city_one |
|  8 |        3 | city_three |
|  9 |        4 |  city_four |
| 10 |        4 |  city_five |

您可以使用以下查询来删除重复的记录:

DELETE city_table 
  FROM city_table
  LEFT JOIN 
  (SELECT MIN(id) AS IDs FROM city_table
   GROUP BY city,state_id
  )A
  ON city_table.ID = A.IDs
  WHERE A.ids IS NULL;

应用上述查询后,您的表将如下所示:

| ID | STATE_ID |       CITY |
------------------------------
|  1 |        1 |   city_one |
|  2 |        1 |   city_two |
|  5 |        2 |   city_one |
|  6 |        3 | city_three |
|  7 |        3 |   city_one |
|  9 |        4 |  city_four |
| 10 |        4 |  city_five |

看到这个SQLFiddle

有关更多信息,请参见DELETEMySQL语法。



 类似资料:
  • 问题内容: 我有下表: 现在,我想为每个用户创建所有可能的语言对,这意味着我希望结果集为:对于用户1:(2,7),(7,8),(2,8) 对于用户2:(10,3) 为此,我已经完成了以下查询: 我得到的结果是针对用户1的:(2,7),(7,8),(2,8),(7,2),(8,7),(8,2) 对于用户2:(10,3),(3,10) (10,3)和(3,10)对我来说没有区别 如何删除重复的行? t

  • 问题内容: 我有一个Delphi应用程序,其中显示了像这样的查询已玩过的游戏的列表: 当我单击DBNavigator中的删除按钮时,也会删除game_types表中的联接记录。这是一个问题,因为许多其他游戏可以是同一类型。 我需要做些什么才能删除游戏,而不删除游戏类型? 问题答案: 您需要使用“唯一表”动态属性 从MSDN ADO文档 如果设置了“唯一表”动态属性,并且Recordset是对多个表

  • 问题内容: 我的数据库中有一个表,其中有要删除的重复记录。我不想为此创建具有不同条目的新表。我想要的是从现有表中删除重复的条目,而无需创建任何新表。有什么办法吗? 看到这些都是我的字段: id对于每一行都是唯一的。 L11_data对于相应的动作字段是唯一的。 L11_data具有公司名称,而动作具有行业名称。 因此,在我的数据中,我在L11_data中有各自行业的重复公司名称。 我要拥有的是存储

  • 问题内容: 我在PostgreSQL 8.3.8数据库中有一个表,该表上没有键/约束,并且有多个行,它们的值完全相同。 我想删除所有重复项,并且每行仅保留1个副本。 特别是有一列(称为“密钥”)可用于标识重复项,即,每个不同的“密钥”应该只存在一个条目。 我怎样才能做到这一点?(理想情况下,使用单个SQL命令。) 在这种情况下,速度不是问题(只有几行)。 问题答案:

  • 问题内容: 数据库类型为PostGres 8.3。 如果我写了: 我有一些计数超过1的行。如何取出重复的行(我仍然希望每个行都保留1行,而不是+1行…我不想删除所有行。) 例子: 应该变成: 我找到的唯一答案是 在那里,但是我想知道是否可以在没有哈希列的情况下做到这一点。 警告 我没有具有唯一编号的PK,因此无法使用min(…)技术。PK是3个字段。 问题答案: 这是所有表都应具有主键的众多原因之

  • 问题内容: 我有三个表,每个表都有一个外键。当执行联接时,我得到重复的列。 给定 我的查询语句: 我的目标是从联接中获得所有列的一行,而没有重复的列。那么我应该使用什么SQL语句语法? 问题答案: 默认情况下,如果使用MySQL,MySQL将返回所有表的所有列。您将需要在查询中显式输入列名称,以所需的方式检索它们。使用查询,如下所示: