0

我有两张桌子:演员和电影,还有第三张桌子角色,它将它们连接起来。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

该查询返回给我笛卡尔积。可能是什么问题?提前谢谢你!

4

2 回答 2

2

问题是您要加入movies两次:一次 as mo,一次 as movies。从未在任何子句或子句mo中提及,因此您永远不会过滤掉. 要修复它,只需删除该部分,并将 -list 中的字段更改为使用而不是:ONWHEREmomovies mo,SELECTmoviesmo

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

此外,您实际上并不需要加入 to actors,因为您没有从中选择任何东西actors并且您已经知道actorid您想要什么价值。因此,将其删除,并为清晰起见进行了一些重组:

SELECT movies.date,
       movies.title,
       role.roleDescription
  FROM movies
  JOIN role
    ON role.movieCode = movies.movieCode
 WHERE role.actorid = 2
;
于 2013-12-22T18:16:56.130 回答
0

试试这个,因为你想为特定演员选择演员的电影和角色,你可以跳过演员表上的加入,同样在你的查询中你加入电影两次

SELECT mo.date, mo.title, r.roleDescription
FROM movies mo, 
INNER JOIN role r
ON r.movieCode=mo.movieCode
WHERE r.actorid=2
于 2013-12-22T18:18:42.843 回答