SQL Запрос не показывает результаты. Запрос состоит в том, чтобы перечислить имена всех актеров, которые играли в mov ie 'Anand' - PullRequest
0 голосов
/ 19 января 2020

Пожалуйста, смотрите таблицы в предоставленных ссылках:

https://i.stack.imgur.com/QUxET.png

https://i.stack.imgur.com/2Mbb8.png

Подзапрос Метод:

select p.Name from Person p where p.PID in 
(select 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 mc.PID = p.PID 
group by m.MID 
having lower(m.title)='anand'

Ответы [ 2 ]

0 голосов
/ 19 января 2020
  1. Ваш первый запрос работает без ошибок, и если вы внесете коррективы, как в следующих нескольких моих шагах, будет работать и второй.

  2. Ваш второй запрос: вы нельзя выбрать только 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;
    
  3. Ваш второй запрос также содержит предложение 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;
    
  4. Теперь, когда оба запроса работают, вам нужно проверить, есть ли в ваших данных mov ie с заголовком 'ANAND'. Также вам нужно проверить, есть ли у вас соответствующие данные MID и PID в других таблицах.

  5. Я проверил это в MySQL, но это может помочь вам, даже если вы используете другую базу данных чтобы помочь вам в некоторых ошибках ... Вот небольшая демонстрационная программа в MySQL, где вы увидите, что данные не будут возвращены, если в одной таблице нет данных.

  6. Вот небольшая ДЕМО для SQLite, где вы можете увидеть, что ваш первый запрос работает: http://sqlfiddle.com/#! 7 / 3ec44 / 1 , а вот небольшая ДЕМО, где вы можете увидеть, что мой запрос код работает: http://sqlfiddle.com/#! 7 / 3ec44 / 2 Пожалуйста, проверьте данные!

  7. После того как я обменялся несколькими комментариями с 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 удалит все пробелы в значении, и соединение станет возможным.

0 голосов
/ 19 января 2020

ВЫБРАТЬ MOV IE .title, person.name ОТ (MOV IE ВНУТР. СОЕДИНЕНИЕ mcast ON MOV IE .MID = mcast.MID) ВНУТРЕННЕЕ ПОДКЛЮЧЕНИЕ MOV IE .title) = "ANAND"));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...