从 3 个不同的表创建视图?

Create view from 3 different tables?

我正在尝试在 MySQL 中创建一个视图以包含 3 个不同的表。

CREATE TABLE ACTOR (
    ACTOR_ID    DECIMAL (2,0) PRIMARY KEY NOT NULL, 
    ACTOR_FIRST CHAR(25), 
    ACTOR_LAST  CHAR(30), 
    DOB         DATE
);

CREATE TABLE DIRECTOR (
    DIRECTOR_ID     DECIMAL(2,0) PRIMARY KEY NOT NULL, 
    DIRECTOR_FIRST  CHAR(25), 
    DIRECTOR_LAST   CHAR(30) 
);

CREATE TABLE FILM (
    FILM_ID         DECIMAL(2,0) PRIMARY KEY NOT NULL, 
    TITLE           CHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     DECIMAL(2,0), 
    GENRE_ID        CHAR(10), 
    PRODUCTION_ID   CHAR(3) 
);

我正在尝试创建的VIEW

create view film_production as 
select 
    title, 
    actor_first, 
    actor_last, 
    director_first, 
    director_last, 
    Production_id, 
    release_date 
from    film, 
        actor, 
        director
;

这给了我 192 个结果。但是我只有3个演员,8个导演8个电影,6个production_id的。另一件需要注意的事情是 1 部电影中有 3 个演员中的 2 个,所以我应该至少有 9 部电影不显示 192。我不知道我做错了什么。我就是想不通。我在想也许 join 或某种。

是的,您的视图应该使用联接。

但是,您似乎缺少 table,例如 film_actor。 使用缺失的 table,并假设您正在尝试获取每部电影的演员和导演,它将是

SELECT 
  FILM.*
 ,ACTOR_FIRST + ' ' + ACTOR_LAST AS actor
 ,DIRECTOR_FIRST + ' ' + DIRECTOR_LAST AS director
FROM FILM
INNER JOIN FILM_ACTOR fa ON fa.FILM_ID = FILM.FILM_ID
INNER JOIN ACTOR ON ACTOR.ACTOR_ID = FILM_ACTOR.ACTOR_ID
INNER JOIN DIRECTOR d ON d.DIRECTOR_ID = FILM.DIRECTOR_ID

正如我提到的,您缺少一个 table 可以容纳 多个演员 并将他们与一部电影相关联:一对多关系。

有没有想过在演员表和电影表、导演表和电影表之间添加引用键?

演员

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);

导演

CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);

与演员和导演有联系的电影

CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);

合并 3 个表的视图

create view film_production as 
select 
    title, 
    a.firstname as actor_firstname, 
    a.lastname as actor_lastname, 
    d.firstname as director_firstname, 
    d.lastname as directory_lastname, 
    Production_id, 
    release_date 
from       film f
left join actor a on f.actor_id = a.id
left join director d on f.director_id = d.id;

示例:http://sqlfiddle.com/#!9/9fe1e

请注意,我对 ID 字段使用 INT 而不是 DECIMAL,并使用 VARCHAR 而不是 CHAR 字段。这可能有助于为大多数通用用途分配正确的 space。