【问题标题】:How do I insert data from multiple tables into one table如何将多个表中的数据插入到一个表中
【发布时间】:2013-11-08 01:57:59
【问题描述】:

这是问题:

使用 SQL CREATE TABLE 语句创建一个表 MOVSTARDIR,其中包含电影编号、明星编号、导演编号和 4 个表演奖项的属性。主键是电影编号、明星编号和导演编号(均为 3 个),并强制执行参照完整性。导演编号是那部电影的导演,并且该明星必须在那部电影中出现。 使用 INSERT INTO 加载 MOVSTARDIR(从现有表)。


这是我目前的解决方案:

CREATE TABLE MOVSTARDIR
(
MVNUM SHORT NOT NULL,
STARNUM SHORT NOT NULL,
DIRNUM SHORT NOT NULL,
BESTF TEXT,
BESTM TEXT,
SUPM TEXT,
SUPF TEXT
);

ALTER TABLE MOVSTARDIR ADD CONSTRAINT PrimeKey PRIMARY KEY(MVNUM, STARNUM, DIRNUM)

INSERT INTO MOVSTARDIR
SELECT MOVIE.MVNUM, STAR.STARNUM, DIRECTOR.DIRNUM, BESTF, BESTM, SUPF, SUPM
FROM MOVIE, STAR, DIRECTOR, MOVSTAR, MOVDIR
WHERE MOVSTAR.MVNUM = MOVIE.MVNUM
AND MOVDIR.MVNUM = MOVSTAR.MVNUM
AND MOVDIR.DIRNUM = DIRECTOR.DIRNUM

我的问题是创建的表仍然是空白的。如何填写所需的数据?

【问题讨论】:

  • 您的select 查询是否返回任何数据?你在insert语句之后提交了事务吗?

标签: sql create-table


【解决方案1】:

我会试试这个:

CREATE TABLE MOVSTARDIR AS
(SELECT MOVIE.MVNUM, STAR.STARNUM, DIRECTOR.DIRNUM, BESTF, BESTM, SUPF, SUPM
FROM MOVIE, STAR, DIRECTOR, MOVSTAR, MOVDIR
WHERE MOVSTAR.MVNUM = MOVIE.MVNUM
AND MOVDIR.MVNUM = MOVSTAR.MVNUM
AND MOVDIR.DIRNUM = DIRECTOR.DIRNUM)

【讨论】:

    【解决方案2】:

    第 1 步:检查 select 是否返回任何数据

    对于测试,您不需要它来返回完整的数据。
    只需包含一个 WHERE 子句来测试较小的结果集。


    第 2 步:确保该选择的预期结果是正确的。


    步骤 3.1:从选择中插入新表


    步骤 3.2:

    如果为您的会话启用了自动提交,并且没有错误。
    那么这些记录应该在新表中。

    如果自动提交已关闭,那么您仍需要提交您的更改。
    例如this older SO post


    备注:

    您的查询仍在使用旧样式连接表。
    更好地使用当前标准JOIN syntax
    它具有更好的可读性。
    并且缺少哪些连接条件变得更加明显。
    您不会意外地想要cartesian join

    例如:

    SELECT 
    MOVIE.MVNUM, STAR.STARNUM, DIRECTOR.DIRNUM, BESTF, BESTM, SUPF, SUPM
    FROM MOVIE 
    JOIN MOVSTAR ON MOVSTAR.MVNUM = MOVIE.MVNUM
    LEFT JOIN STAR ON STAR.STARNUM = MOVSTAR.STARNUM
    LEFT JOIN MOVDIR ON MOVDIR.MVNUM = MOVSTAR.MVNUM
    LEFT JOIN DIRECTOR ON DIRECTOR.DIRNUM = MOVDIR.DIRNUM
    

    请注意,加入了 STAR。
    在不知道表格的情况下,这当然只是一个假设。
    但你明白了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多