更新和交叉查询具有非不同值的表?
Posted
技术标签:
【中文标题】更新和交叉查询具有非不同值的表?【英文标题】:Updating and cross-querying tables with non-distinct values? 【发布时间】:2016-04-16 03:39:39 【问题描述】:我正在使用 IMDb 数据来查找一些选定电影的完整剧组信息。
我已根据我的要求隔离了我的电影数据集。我现在有一个表 movie (movie_id, movie_title, movie_year)
,有 476 行。
然后我列出了所有参与过这些电影的不同个人,总共 44,706 行存储在表 person (person_id, person_name)
中。
现在我正在尝试整理一个表 crew (person_id, movie_id, role_id)
,其中每一行都包含 person_id 和 movie_id 的唯一组合,说明同一个人本来可以拍多部电影的。
首先,我创建了表格,并用不明显的人员实例填充它:
CREATE TABLE crew
(
person_id INTEGER,
movie_id INTEGER,
role_id INTEGER,
);
INSERT INTO crew (person_id)
SELECT cast_info.person_id
FROM cast_info
INNER JOIN movie
ON cast_info.movie_id=movie.movie_id;
在这一点上,我应该提到cast_info (id, person_id, movie_id, role_id)
是主表,它包含有关 IMDb 上托管的所有现有人物、电影和角色组合的信息,总共 50,691,107 行。
运行上述代码后,我在 crew 表中得到了 61,842 行。仔细检查 SELECT count(distinct person_id) FROM crew;
告诉我有 44,706 个独特的人,就像我原来的 person 表一样。
现在我正在努力填充 crew 表中的 movie_id 和 role_id 列。我尝试了以下代码:
UPDATE crew
SET movie_id =
(SELECT cast_info.movie_id
FROM cast_info, movie
WHERE cast_info.movie_id=movie.movie_id)
WHERE crew.person_id IN
(SELECT cast_info.person_id
FROM cast_info, person
WHERE cast_info.person_id=person.person_id);
所做的只是用为每一行重复的相同 movie_id 填充 crew.movie_id 列。
我如何更新我的表格以确保对于每个不明确的person_id,只有那些出现在我的movie中的movie_id案例时间>表?我正在研究 SQLite,它不支持 UPDATE 语句上的 INNER JOIN。
【问题讨论】:
同时填充所有列。插入重复值然后尝试更新不是要走的路。 【参考方案1】:如果您共享“cast_info”的架构,将会很有帮助。目前尚不清楚为什么您没有从一开始就使用movie_id 填充船员,因为您显然可以使用它,因为您在此JOIN ON 子句中使用了它:
ON cast_info.movie_id=movie.movie_id;
您可以将初始插入子句更新为:
INSERT INTO crew (person_id, movie_id)
SELECT cast_info.person_id, cast_info.movie_id
FROM cast_info
INNER JOIN movie
ON cast_info.movie_id=movie.movie_id;
这将同时插入 person_id 和 movie_id。
目前尚不清楚您将从哪里提取角色信息,但我想填充它会很简单,因为 person_id 和 movie_id 现在可用于任何需要的 JOIN。
【讨论】:
老实说,我并没有从一开始就用所有东西填充船员表,因为我刚开始使用 SQL,我没有意识到 INSERT INTO 可以处理多个列立刻。您的建议非常有效,谢谢!以上是关于更新和交叉查询具有非不同值的表?的主要内容,如果未能解决你的问题,请参考以下文章