3

这是问题:

使用 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

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

4

2 回答 2

0

我会试试这个:

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)
于 2013-10-29T04:00:11.437 回答
0

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

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


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


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


步骤 3.2:

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

如果自动提交关闭,那么您仍然需要提交您的更改。
例如这个较旧的SO帖子


评论:

您的查询仍在使用旧样式连接表。
更好地使用当前的标准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。
在不知道表格的情况下,这当然只是一个假设。
但你明白了。

于 2018-05-20T09:35:48.380 回答