Ваш первый запрос работает без ошибок, и если вы внесете коррективы, как в следующих нескольких моих шагах, будет работать и второй.
Ваш второй запрос: вы нельзя выбрать только p.Name и сгруппировать только по m.MID. Если он находится в предложении select и не является частью агрегатной функции, тогда вы должны использовать его в выражении group by. Например, вот так:
select p.Name
from Movie m
join M_Cast mc on m.MID = mc.MID
join Person p on mc.PID = p.PID
group by p.Name;
Ваш второй запрос также содержит предложение HAVING having lower(m.title)='anand'
, но оно должно быть в предложении where следующим образом:
select p.Name
from Movie m
join M_Cast mc on m.MID = mc.MID
join Person p on mc.PID = p.PID
where lower(m.title)='anand'
group by p.Name;
Теперь, когда оба запроса работают, вам нужно проверить, есть ли в ваших данных mov ie с заголовком 'ANAND'. Также вам нужно проверить, есть ли у вас соответствующие данные MID и PID в других таблицах.
Я проверил это в MySQL, но это может помочь вам, даже если вы используете другую базу данных чтобы помочь вам в некоторых ошибках ... Вот небольшая демонстрационная программа в MySQL, где вы увидите, что данные не будут возвращены, если в одной таблице нет данных.
Вот небольшая ДЕМО для SQLite, где вы можете увидеть, что ваш первый запрос работает: http://sqlfiddle.com/#! 7 / 3ec44 / 1 , а вот небольшая ДЕМО, где вы можете увидеть, что мой запрос код работает: http://sqlfiddle.com/#! 7 / 3ec44 / 2 Пожалуйста, проверьте данные!
После того как я обменялся несколькими комментариями с OP, я заметил, что, возможно, это это пробел в данных, создающий проблему. Поэтому я предложил следующее:
select p.Name
from Person p
where trim(p.PID, ' ') in (select trim(mc.PID, ' ')
from M_Cast mc
where mc.MID in (select m.MID
from Movie m
where lower(title)='anand'))
Это также может быть реализовано во втором запросе:
select p.Name
from Movie m
join M_Cast mc on m.MID = mc.MID
join Person p on trim(mc.PID, ' ') = trim(p.PID, ' ')
where lower(m.title)='anand'
group by p.Name;
Проблема заключалась в том, что в запросе были объединены две таблицы с mc.PID = p.PID
и один столбец имел данные с пробелами. Таким образом, запрос пытался объединить эти данные: ' 1' = '1'
. Функция TRIM удалит все пробелы в значении, и соединение станет возможным.