2017-09-03 107 views
0

我目前正在学习SQL,并且正在尝试使用INEXISTS重新编写查询,但没有任何内容似乎给我提供了正确的答案。 的问题是:使用EXISTS使用IN写入查询

对于每个评级是(星最少)的最低目前在数据库中,返回评审名,电影片名,星数

模式:

  • 电影(MID,名称,年份,导演)

  • 点评(RID,名)

  • 评级(RID,MID,明星,RATINGDATE)

我的查询是:

Select distinct rew.name, m.title, r.stars 
from movie m join rating r on m.mID = r.mID 
join reviewer rew on r.rID = rew.rID 
where r.stars in (Select min(stars) from rating) 

我试图写的是通过加入子查询与外部查询来存在。我尝试了所有不同的键,但迄今为止还没有任何工作。

回答

2

所以,你首先需要获得每部电影的最低等级,如:

SELECT mID, MIN(stars) AS stars 
FROM rating 
GROUP BY mID; 

,然后用rating表再次加入,以获得评审ID,例如:

SELECT r.rID, a.mID, a.stars 
FROM rating r JOIN (
    SELECT mID, MIN(stars) AS stars 
    FROM rating 
    GROUP BY mID 
) a ON r.MID = a.mID and r.stars = a.stars; 

现在,您可以加入与电影和审阅表格上面的查询得到的标题,例如:

SELECT m.title, re.name, b.stars 
FROM movie m JOIN (
    SELECT r.rID, a.mID, a.stars 
    FROM rating r JOIN (
     SELECT mID, MIN(stars) AS stars 
     FROM rating 
     GROUP BY mID 
    ) a ON r.MID = a.mID and r.stars = a.stars 
) b 
ON m.mID = b.mID 
JOIN reviewer re ON re.rID = b.rID; 
2

我猜猜使用NOT EXISTS可以做这个工作

SELECT distinct rew.name, m.title, r.stars 
FROM movie m 
JOIN rating r ON m.mID = r.mID 
JOIN reviewer rew ON r.rID = rew.rID 
WHERE NOT EXISTS 
(
    SELECT 1 
    FROM Rating r2 
    WHERE r2.stars > r.stars 
)