更新和交叉查询具有非不同值的表?

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_idmovie_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_idrole_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.movi​​e_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 可以处理多个列立刻。您的建议非常有效,谢谢!

以上是关于更新和交叉查询具有非不同值的表?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 在一个查询中更新具有不同值的多行

如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?

具有动态列名和多个输入列的 PostgreSQL 交叉表

使用具有和 MIN 函数非键保留表错误进行更新

修改列表视图查询集以汇总包含具有相同值的列的表

将具有不同关系值的表转换为excel列