2016-04-16 41 views
0

我正在使用IMDb數據來查找一些選定電影的完整劇組信息。更新和交叉查詢具有非重複值的表?

我已經根據我的要求隔離了我的電影數據集。我現在有一個表movie (movie_id, movie_title, movie_year),有476行。

然後我列出了所有在這些電影中工作過的不同人物,總共存儲在表person (person_id, person_name)中的44,706行。

現在我試圖把一個表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行。

運行上面的代碼後,我在乘員組表表中以61,842行結束。仔細檢查SELECT count(distinct person_id) FROM crew;告訴我,有44,706個獨特的人,如我在原來的表中。

現在我在努力填補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

同時填充所有列。插入重複值然後嘗試更新不是要走的路。 –

回答

1

如果您共享'cast_info'的模式將會很有幫助。

ON cast_info.movie_id=movie.movie_id; 

你可以更新您的初始插件條款是:你爲什麼不從一開始就movie_id填充的船員,因爲你清楚地把它提供給你,因爲你在這一JOIN ON子句中使用它目前還不清楚:

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。

+0

老實說,我沒有從一開始就填充所有的表,因爲我剛剛開始使用SQL,並且我沒有意識到INSERT INTO可以同時處理多個列。您的建議非常有效,謝謝! – AlexZ