Sql 如何列出所有电影​杰夫·戈德布鲁姆,但不是​布鲁斯·威利斯?

Sql 如何列出所有电影​杰夫·戈德布鲁姆,但不是​布鲁斯·威利斯?,sql,postgresql,Sql,Postgresql,我的模型有三个表:演员表、电影表和电影演员表,代表演员和电影之间的关系 表:演员 列:姓名、出生年月 主键:姓名、出生年月 表:电影 栏目:标题、发行年份、流派、导演 主键:标题、发布年份 表:电影演员 栏目:电影FK,电影发行年FK,演员FK,出生年FK 我需要列出所有电影的标题、发行年份、类型和导演​'杰夫·戈德布鲁姆,但不是​'布鲁斯·威利斯​. 我尝试了下面的查询,但它不起作用。它把我看过的所有电影都还给了我​杰夫·戈德布鲁姆主演,包括他与布鲁斯·威利斯合作的那些 SELECT A.NA

我的模型有三个表:演员表、电影表和电影演员表,代表演员和电影之间的关系

表:演员

列:姓名、出生年月 主键:姓名、出生年月 表:电影

栏目:标题、发行年份、流派、导演 主键:标题、发布年份 表:电影演员

栏目:电影FK,电影发行年FK,演员FK,出生年FK 我需要列出所有电影的标题、发行年份、类型和导演​'杰夫·戈德布鲁姆,但不是​'布鲁斯·威利斯​.

我尝试了下面的查询,但它不起作用。它把我看过的所有电影都还给了我​杰夫·戈德布鲁姆主演,包括他与布鲁斯·威利斯合作的那些

SELECT A.NAME, M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM ACTORS A
    JOIN MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
    JOIN MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
WHERE A.NAME = 'Jeff Goldblum' AND A.NAME != 'Bruce Willis'
如何编写查询以返回杰夫·戈德布鲁姆单独或与其他演员(布鲁斯·威利斯除外)共同主演的电影?

您可以使用“不存在”条件筛选出由布鲁斯·威利斯主演的电影:

选择A.NAME、M.TITLE、M.RELEASE\u YEAR、M.流派、M.DIRECTOR 演员A 加入电影(在A.NAME=MC.ACTOR和A.BIRTH\u YEAR=MC.BIRTH\u YEAR上由MC出演) 加入电影M ON M.TITLE=MC.MOVIE和M.RELEASE\u YEAR=MC.MOVIE\u RELEASE\u YEAR 其中A.NAME='Jeff Goldblum'和 不存在选择* 演员b 其中b.NAME=MC.ACTOR和 b、 出生年份=MC.出生年份和 b、 姓名='Bruce Willis'
一种选择是按电影及其元数据进行聚合,然后断言杰夫·戈德布鲁姆在场,布鲁斯·威利斯不在场:

SELECT M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM ACTORS A
INNER JOIN MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
INNER JOIN MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
GROUP BY M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
HAVING
    COUNT(CASE WHEN A.NAME = 'Jeff Goldblum' THEN 1 END) > 0 AND  -- Goldblum appears
    COUNT(CASE WHEN A.NAME = 'Bruce Willis' THEN 1 END) = 0;      -- but not Willis
我刚刚发现了EXCEPT语句,它是减号语句,具体取决于所使用的数据库

所以我的问题变成:

SELECT M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM   ACTORS A
    JOIN   MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
    JOIN   MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
WHERE  A.NAME = 'Jeff Goldblum' 

EXCEPT

SELECT M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM   ACTORS A
    JOIN   MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
    JOIN   MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
WHERE  A.NAME = 'Bruce Willis' 

成功了

我已经试过了,但这仍然是布鲁斯·威利斯(Bruce Willies)和杰夫·戈德布卢姆(Jeff Goldblumt)主演的电影。这需要执行两个查询,因此可能没有其他两个答案那么有效。