【问题标题】:Cross-query with IN/INTERSECT, INNER JOIN or EXISTS?使用 IN/INTERSECT、INNER JOIN 或 EXISTS 进行交叉查询?
【发布时间】:2016-08-07 21:12:17
【问题描述】:

我正在使用 IMDb 数据来查找一些选定电影的完整剧组信息。

我有一个名为 movie 的表,我在其中隔离了符合我要求的电影,总共 476 行,其中 movie_id 是每部电影的唯一标识符。

我有一个名为 crew_info 的表,其中包含 movie_idperson_idrole_id 列。

作为第一步,我想创建一个新表,仅隔离那些在我的 movie 表中存在的电影的工作人员。我想要一份不同人物的名单,因此即使同一个人参与了 movie 中的多部电影,也不会出现重复。

我可以想到几种方法来做到这一点,但不确定是否有区别/哪个更好。首先,我创建了一个新表:

CREATE TABLE person
(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    person_id INTEGER,
    person_name TEXT,
    person_birth INTEGER
);

现在我认为我需要执行以下操作之一:

INSERT INTO person (person_id)
    SELECT DISTINCT person_id
    FROM cast_info
    WHERE movie_id IN
    (
        SELECT movie_id
        FROM cast_info
        INTERSECT
        SELECT movie_id
        FROM movie
    );

或者

INSERT INTO person (person_id)
    SELECT DISTINCT person_id
    FROM cast_info
    INNER JOIN movie
    ON cast_info.movie_id=movie.movie_id;

或者

INSERT INTO person (person_id)
    SELECT DISTINCT person_id
    FROM cast_info
    WHERE EXISTS 
        (
        SELECT movie_id
        FROM cast_info
        WHERE cast_info.movie_id=movie.movie_id
        );

稍后我打算使用类似的语句,使用从其他相关表交叉查询的 person_nameperson_birth 值更新表。

这些表达式会产生相同的结果吗?如果不是,哪一种效果最好?

【问题讨论】:

  • 你是从哪里得到 person_name 和 person_birth 的?
  • @vkp 还有另外两个表,分别称为 nameperson_info,分别保存着各自的信息。每个都依赖于相同的 person_id 标识符。不想将它们包含在这篇文章中以避免让它变得过于丰富,我想如果我克服了最初对这些陈述的困惑,我想弄清楚这些问题就不会那么麻烦了。

标签: sql database sqlite exists


【解决方案1】:

您将从这三个方面得到相同的结果。我会推荐INNER JOIN,因为它是最简单的写法。性能上的提升可能总是可以忽略不计,但查询 2 和 3 将需要更少的索引扫描。查询 1 将扫描 cast_info 两次。

要在之后更新表格,您可以执行以下操作:

UPDATE P
SET P.Person_Name = T.Person_Name
FROM Person P
INNER JOIN OtherTable T on T.Person_ID = P.Person_ID

当然,运行SELECT,验证您的列,然后将前两行更改为更新并自信地启动总是很好。

SELECT P.Person_ID, P.Person_Name, T.Person_ID, T.Person_Name
FROM Person P
INNER JOIN OtherTable T on T.Person_ID = P.Person_ID

【讨论】:

    【解决方案2】:

    这个相交是多余的

    WHERE movie_id IN
        (
            SELECT movie_id
            FROM cast_info
            INTERSECT
            SELECT movie_id
            FROM movie
        );
    

    我觉得join是最直接的

    INSERT INTO person (person_id)
    SELECT DISTINCT person_id
    FROM cast_info
    INNER JOIN movie
    ON cast_info.movie_id=movie.movie_id;
    

    为什么?

    CREATE TABLE person
    ( id INTEGER PRIMARY KEY AUTOINCREMENT
    

    只需使用 person_id 作为主键

    并使用日期作为生日

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2020-06-28
      相关资源
      最近更新 更多