sql - 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'
第一行的名称有一个额外的空间。需要删除这些重复项
解决方案
但这里的问题是 Person 中有多个具有相同 PID 的行。
这真的没有意义。据推测,PID
是Person
表的主键。这意味着 中的每个值只有一行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
. 通常,您希望计算第二个表中的匹配项。
推荐阅读
- excel - 如果单元格包含使用 vba 的特定单词,如何格式化整行?
- ios - 设备未连接到外部电源时未触发 BGProcessingTask
- php - WordPress延迟脚本插件不加载网站
- android - 处理命令时发生未知的服务器端错误。无法将命令代理到远程服务器。原始错误:错误:套接字挂起
- apache-camel - 使用 CamelTestSupport 在 Karaf 4.2.7 中测试骆驼 2.24.x 路线
- c# - 如何正确处理存储过程中的死锁?
- pandas - 对应列之间的求和积 - Pandas / Numpy
- angular - Angular 8中的水平滚动事件?
- reactjs - 使用 React Router Dom 将用户传递给类
- regex - 获得第二组的一部分