首页 > 解决方案 > SQLite 从具有相同主键的多行的表中删除重复项

问题描述

我的问题是列出所有导演过 10 部电影或更多电影的导演,按照他们导演的电影数量的降序排列。返回导演的姓名和每个导演的电影数量

我有两张表,一张是 Director 表,它有 ID(主键)、MID、PID 列。另一个是具有 PID(主键)、名称、性别列的 Person 表。

以下是我的查询

SELECT Name, COUNT(*) movies_directed
FROM Director
LEFT JOIN Person USING(PID)
GROUP BY PID
HAVING movies_directed >= 10
ORDER BY movies_directed DESC;

但这里的问题是,Person 中有多个具有相同 PID 的行。

这是示例数据

当我执行查询

SELECT * FROM Person WHERE Name LIKE '%Andy Serkis%';

结果是

index        PID          Name           Gender
4        'nm0785227'     **' Andy Serkis'**  'Male'
36821    'nm0785227'     'Andy Serkis'   'Male'

第一行的名称有一个额外的空间。需要删除这些重复项

标签: sqlsqlite

解决方案


但这里的问题是 Person 中有多个具有相同 PID 的行。

这真的没有意义。据推测,PIDPerson表的主键。这意味着 中的每个值只有一行Person。可能有多行Director——因为一个人可以导演不止一部电影。

我认为您的查询将返回正确的结果。但是,它的措辞不正确。

使用内部连接会更好,因为您只考虑导演至少一部电影(实际上至少有 10 部电影)的人。所以:

SELECT p.Name, COUNT(*) as movies_directed
FROM Person p JOIN
     Director d
     USING (PID)
GROUP BY PID, p.Name
HAVING movies_directed >= 10
ORDER BY movies_directed DESC;

笔记:

  • 当您引用多个表时,您应该限定所有列名。一个例外是USING子句中的列。
  • 表别名使查询更易于编写和阅读。
  • 在您的版本中,您有COUNT(*). 这通常不适用于LEFT JOIN. 通常,您希望计算第二个表中的匹配项。

推荐阅读