我们可以优化此查询吗?

时间:2014-01-12 12:24:07

标签: sql query-optimization

我目前正在Coursera上解决数据库练习并遇到问题。

问题

您已经开设了一个新的电影评级网站,并且您一直在收集评论者对各种电影评分的数据。目前还没有太多数据,但您仍然可以尝试一些有趣的查询。这是架构:

Movie ( mID, title, year, director ) 
Reviewer ( rID, name )
Rating ( rID, mID, stars, ratingDate )

查找所有没有评分的电影的标题。

解决方案1 ​​

SELECT DISTINCT title
FROM Movie, Rating
WHERE Movie.mID NOT IN
(SELECT mID
FROM Rating)

解决方案2

SELECT DISTINCT title
FROM Movie, Rating
WHERE NOT EXISTS(SELECT * FROM Rating
WHERE Rating.mID = Movie.mID)

解决方案3

SELECT title
FROM Movie
WHERE title NOT IN(SELECT title
FROM Movie NATURAL JOIN Rating)

我想知道这是否可以优化,因为我应用了DISTINCT来让它们运行。

2 个答案:

答案 0 :(得分:3)

首先,您不需要select from Movie, 评分,因为您没有对评级表做任何事情。

这是一个可怕的(无用的)交叉连接=>笛卡尔积,强迫你做一个独特的。

所以

select m.title
from Movie m
where not exists (select null -- or select *, doesn't change anything
                  from Rating r
                  where r.mId = m.mID)

你也可以这样做,但我认为前一个更清楚。

select m.title
from Movie m
left join Rating r on r.mId = m.mID
where r.rID is null

NOT IN查询(没有加入评级)也完全有效,但可能性能最差,并且会以这种方式编写。

select m.title 
from Movie m
where m.mId not in (select distinct mID from Rating)

答案 1 :(得分:0)

不需要在外部FROM中包含评级,如果没有它,则可以避免使用DISTINCT。