我正在研究一个研究项目,使用IMDb数据集作为我的辅助数据来源。我从IMDb本身提供的.ftp服务器下载文本格式的整个数据库,并使用IMDbPY python包将所有未排序的信息编译到关系数据库中。我选择使用SQLite作为我的SQL引擎,因为它能够创建本地存储的数据库,因此它似乎是最不麻烦的选择。经过一番探索和大量的文档阅读后,我最终得到了一个9.04 GB的im.db文件,托管了整个IMDb。
现在我需要根据我的要求隔离我的数据集,但由于我缺乏SQL经验,我发现很难找到最佳的方法。
具体来说,我想看一下:
Here's表示我的数据库架构。我对IMDbPY创建者所做的一些数据库设计选择感到困惑,但我不是SQL专家,这就是我的工作。一些澄清:
SELECT count(*) FROM title WHERE kind_id=1 AND production_year BETWEEN 2000 AND 2015;
告诉我,在2000 - 2015年之间有442,135个电影实例。到目前为止一切顺利。这对我来说很棘手。 movie_info 表包含2000万行有关电影和电视节目的信息,包括运行时,流派,制作国家,制作年份等。基本上我需要隔离数据集的所有信息。在该表中(i) id 是任意自动递增的主键; (ii)movie_id是指来自 title 的 id 值; (iii) info_type_id 指的是表 info_type 中列出的113种信息之一; (iv) info 保存实际信息,如整数或字符串。
例如:正在运行SELECT id FROM title WHERE title='2001: A Space Odyssey' AND kind_id=1;
会返回'2484213'。运行SELECT info FROM movie_info WHERE movie_id=2484213 AND info_type_id=1;
返回'142,161,149',表示电影的三个可用版本的运行时间(以分钟为单位)。运行SELECT info FROM movie_info WHERE movie_id=2484213 AND info_type_id=8
返回'USA,UK',表示参与生产的国家/地区。等等。
基本上我正在尝试创建一个新表,只填充符合我要求的电影,而且我很难找到最有效的方法。以下是我将需求转换为基本SQL语法的方法:
SELECT * FROM title WHERE kind_id=1 AND production_year BETWEEN 2000 AND 2015;
info_type_id=1 AND info>40;
(ii)info_type_id=3 AND info!='Adult';
(iii)info_type_id=8 AND info='USA';
WHERE subject_id=2 AND status_id=3 OR 4;
我一直在阅读SQLite文档,并怀疑我需要使用INNER / LEFT OUTER JOIN,EXISTS和UNION / INTERSECT / EXCEPT语句的某种组合,但不确定如何准确地处理它。我想有效地编写这段代码,因为按要求执行强制查询需要一段时间才能让我的计算机处理。提前感谢您的帮助。
TL; DR。我无法找出使用INNER / LEFT OUTER JOIN,EXISTS和UNION / INTERSECT / EXCEPT语句的有效方法来帮助我根据多个数据集隔离较小的数据集要求,以满足我需要交叉查询许多现有表而没有正确索引的外键。
答案 0 :(得分:0)
内部联接是否所有必需的表格对您的需求来说太慢了?
您可以创建仅包含所需子集数据的表,然后对这些表运行内部联接。
所以创建一个表"电影"并仅插入" title"中的那些记录。与kind_id为1.然后执行类似
的操作Select *
FROM
movie m
inner join movie_info mi
on m.id = mi.movie_id
inner join complete_cast cc
on m.id = cc.id
WHERE
...
如果您的新表格没有相同数量的数据,那么它应该会表现得更好。