我有两个表:演员和电影,以及第三个表角色,它连接它们。ActorId 是 actor 的主键。电影代码是电影表的主键。我有一个演员页面,我需要在其中显示电影的发布日期、电影名称和演员的角色。我的查询是:
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
查询返回笛卡尔积。可能是什么问题?提前谢谢你!
问题是你要加入两次movies
:一次是mo
,一次是movies
。 mo
从未在任何ON
子句或WHERE
子句中提及,因此您永远不会过滤掉mo
的任何值。要修复它,只需删除movies mo,
部分,然后将 SELECT
-list 中的字段更改为使用 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
;
试试这个,因为你想为特定的演员选择电影和演员的角色,你可以跳过加入演员表,在你的查询中,你也加入了电影两次
SELECT mo.date, mo.title, r.roleDescription
FROM movies mo,
INNER JOIN role r
ON r.movieCode=mo.movieCode
WHERE r.actorid=2