我有两个表:演员和电影,以及连接它们的第三个表角色。 ActorId是演员的主键。 MovieCode是电影表的主键。我有一个演员的页面,我需要显示电影发布的日期,电影的名称和演员的角色。 我的疑问是:
SELECT mo.date, mo.title, role.roleDescription
FROM movies mo, role
inner join actors
on role.actorId=actors.actorId
inner join movies
on role.movieCode=movies.movieCode
where role.actorid=2
查询返回笛卡尔积。可能是什么问题?提前谢谢你!
答案 0 :(得分:2)
问题在于您加入movies
两次:一次为mo
,一次为movies
。任何mo
子句或ON
子句中都不会提及WHERE
,因此您永远不会过滤掉mo
的任何值。要解决此问题,只需删除movies mo,
部分,然后更改SELECT
- 列表中的字段即可使用movies
代替mo
:
SELECT movies.date, movies.title, role.roleDescription
FROM role
inner join actors
on role.actorId=actors.actorId
inner join movies
on role.movieCode=movies.movieCode
where role.actorid=2
此外,您实际上不需要加入actors
,因为您没有从actors
中选择任何内容,而且您已经知道了actorid
的所需价值。所以删除它,并重新调整一点,以明确:
SELECT movies.date,
movies.title,
role.roleDescription
FROM movies
JOIN role
ON role.movieCode = movies.movieCode
WHERE role.actorid = 2
;
答案 1 :(得分:0)
尝试这个,因为你想为特定的演员选择演员的电影和角色,你可以跳过演员表上的连接,也可以在你的查询中两次加入电影
SELECT mo.date, mo.title, r.roleDescription
FROM movies mo,
INNER JOIN role r
ON r.movieCode=mo.movieCode
WHERE r.actorid=2