我目前正在Coursera上解决数据库练习并遇到问题。
您已经开设了一个新的电影评级网站,并且您一直在收集评论者对各种电影评分的数据。目前还没有太多数据,但您仍然可以尝试一些有趣的查询。这是架构:
Movie ( mID, title, year, director )
Reviewer ( rID, name )
Rating ( rID, mID, stars, ratingDate )
查找所有没有评分的电影的标题。
SELECT DISTINCT title
FROM Movie, Rating
WHERE Movie.mID NOT IN
(SELECT mID
FROM Rating)
SELECT DISTINCT title
FROM Movie, Rating
WHERE NOT EXISTS(SELECT * FROM Rating
WHERE Rating.mID = Movie.mID)
SELECT title
FROM Movie
WHERE title NOT IN(SELECT title
FROM Movie NATURAL JOIN Rating)
我想知道这是否可以优化,因为我应用了DISTINCT
来让它们运行。
答案 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。