2013-08-03 2 views
0

Вот набор данные:Почему мой запрос возвращает пустой результат?

  • Movie (mID, title, year, director)
    Английские: Существует фильм с идентификационным номером mID, названием, год выпуска, и режиссером.

  • Reviewer (rID, name)
    Английский: Рецензент с идентификационным номером rID имеет определенное имя.

  • Rating (rID, mID, stars, ratingDate)
    Английский: Рецензент rID дал фильму mID ряд звезд рейтинга (1-5) на определенном ratingDate.

Возникает вопрос: найдите названия всех фильмов, у которых нет оценок.

Мой ответ: (возвращает пустое множество)

select m.title 
from movie m 
join rating r on m.mid = r.mid 
where stars is null 

Правильный ответ:

select title 
from movie 
left join rating using (mID) 
where stars is null 

Я не уверен, что случилось с моим присоединиться? Заранее спасибо!

+0

Как мы можем вам помочь? –

ответ

1

Ваш запрос находит каждый movie запись, делает имеет соответствующий rating запись — это значение movie JOIN rating — при условии, что указанный rating запись имеет stars IS NULL.

Правильный запрос находит каждый movie запись, которая либо испытывает недостаток в ratingзаписи или имеет rating записи с stars IS NULL.

Основное различие заключается в том, что ваш запрос будет, в качестве первого шага, отфильтровать movie записи без согласования rating записей (так как они будут не в состоянии объединения), в то время как правильный запрос использует LEFT JOIN, чтобы предотвратить эту фильтрацию.

(Обратите внимание, что, даже с LEFT JOIN, эта фильтрация все еще может произойти, если статья WHERE строится плохо. Например, WHERE stars = 'X' также отфильтровать movie записи без соответствующих rating записи, потому что только существует rating запись может удовлетворить WHERE -clause. Но с WHERE stars IS NULL, эта проблема не возникает, потому что NULL значение по умолчанию stars когда инфу не удалось.)

1

вы можете использовать этот запрос, для которого название не имеет звезд,
"select title from movie left join rating on rating.mid = movie.mid where rating.rid is null"
или вы можете использовать

select title from movie where mid not in (select distinct mid from rating) 
Смежные вопросы