使用非不同值更新和交叉查询表?

时间:2016-04-16 03:39:39

标签: sql database sqlite sql-update

我正在使用IMDb数据查找一些选定影片的完整工作人员信息。

我根据我的要求分离了我的电影数据集。我现在有一个表movie (movie_id, movie_title, movie_year),有476行。

然后我列出了所有制作这些影片的不同个人,表person (person_id, person_name)中共存储了44,706行。

现在我正在尝试整理一个表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);

所有这一切都填充了 crew.movi​​e_id 列,并为每一行重复了相同的 movie_id

如何更新我的表格,以确保每个非独特的 person_id 只有 movie_id 的个案出现在我的电影中表?我正在研究SQLite,它不支持UPDATE语句中的INNER JOIN。

1 个答案:

答案 0 :(得分: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,那么填充是很简单的。