查找他们参加过的演员和电影的列表,如果没有参加,请使电影标题为空

时间:2018-10-01 19:48:02

标签: sql postgresql

所以我只需要返回所有演员以及他们在其中表演的电影,而我不能使用externaljoin,这会使这一切变得容易得多。

这是数据库:

CREATE TABLE actors(
AID INT,
name VARCHAR(30) NOT NULL,
PRIMARY KEY(AID));

CREATE TABLE movies(
    MID INT,
    title VARCHAR(30),
    PRIMARY KEY(MID));

CREATE TABLE actor_role(
    MID INT,
    AID INT,
    rolename VARCHAR(30) NOT NULL,
    PRIMARY KEY (MID,AID),
    FOREIGN KEY(MID) REFERENCES movies,
    FOREIGN KEY(AID) REFERENCES actors);

这是我尝试过的方法,它返回除了没有在电影中演出的演员之外的所有我需要的东西,

SELECT name,title 
FROM actors, actor_role, movies
where actors.AID = actor_role.AID and movies.mid = actor_role.mid;

我只需要更改上述SQL,以包括没有在任何电影中演出过的演员,而无需使用SQL OUTER JOIN语法即可。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

好吧,您可以UNION ALL个演员,actor_role中没有相应的行退出。

SELECT a.name,
       m.title 
       FROM actors a
            INNER JOIN actor_role ac
                       ON a.aid = ac.aid
            INNER JOIN movies m
                       ON m.mid = ac.mid
UNION ALL
SELECT a.name,
       NULL
       FROM actors a
       WHERE NOT EXISTS (SELECT *
                                FROM actor_role ac
                                WHERE ac.aid = a.aid;

我还建议对隐式语法使用显式JOIN语法。