Оператор Case в Oracle показывает все, а не запрашиваемые элементы - PullRequest
0 голосов
/ 04 мая 2018

Я работаю над базой данных фильмов для класса, и мне нужно создать запрос, в котором он получит заголовок и дату выхода фильма, и покажет эти столбцы тогда и только тогда, когда заголовок фильма содержит указан город или есть актер / актриса, связанная с фильмом, который родился или умер в этом городе. Проблема возникает, когда мне нужно добавить третий столбец, в котором сообщается некоторая информация о том, как фильм имеет отношение к данному городу (название содержит его, актер связан с городом и т. Д.). Мне оказали предыдущую помощь, сказав мне использовать оператор CASE (я использую Oracle), и вот к чему я пришел:

SELECT DISTINCT o.titulo, o.fecha_estreno,
CASE 
    WHEN UPPER(o.titulo) LIKE '%ZARAGOZA%' AND EXISTS(SELECT p.id_obra FROM Pelicula p WHERE p.id_obra = o.id_obra) THEN 'Titulo'
    WHEN EXISTS(SELECT DISTINCT pa.id_obra 
        FROM Participa pa
            WHERE pa.id_obra = id_obra AND EXISTS(SELECT DISTINCT l.nombre FROM Lugar l
                WHERE UPPER(l.nombre) LIKE '%ZARAGOZA%' AND EXISTS(SELECT DISTINCT tl.id_lugar FROM TieneLugar tl
                    WHERE tl.id_lugar = l.id_lugar AND tl.id_profesional = pa.id_profesional))) THEN 'Actor relacionado con lugar'
    WHEN EXISTS(SELECT DISTINCT er.id_obra 
        FROM EstaRelacionado er 
            WHERE er.id_obra = id_obra AND EXISTS(SELECT DISTINCT k.keyword 
            FROM Keywords k
                WHERE k.id_keyword = er.id_keyword AND UPPER(k.keyword) LIKE '%ZARAGOZA%')) THEN 'Keyword relacionada con pelicula'
    END AS Causa
FROM Obra o;

Но это просто покажет все названия фильмов, даже если они вообще не связаны. Я обнаружил, что он просто не войдет ни в какое утверждение WHEN, а просто выберет DISTINCT для всех заголовков. Есть ли способ исправить это и показать результат как следует? Пример:

  TITULO          FECHA_ESTRENO              CAUSE
----------       ----------------    ---------------------
Barcelona mia         1967             Title contains city
Lights out            1985             Actor is related to place

РЕДАКТИРОВАТЬ: Например. В выключенном свете есть актер, которому назначено событие (родился или умер), в котором содержится искомый город.

Этот запрос должен отображать только 300 элементов. Это показывает 4400. Я знаю, что это имеет отношение к предложению WHERE, но я попытался написать WHERE Cause NOT NULL; и это не сработает, поскольку столбец Причина на самом деле не существует

1 Ответ

0 голосов
/ 04 мая 2018

В запросе отображаются все фильмы, поскольку в вашем внешнем запросе нет предложения WHERE.

Предложение WHERE - это часть запроса, которая сообщает базе данных, какими свойствами должны обладать возвращаемые строки. (На самом деле WHERE является одним из них, другие тоже могут иметь такой эффект, но это не имеет значения здесь и сейчас, в настоящее время вы тоже не используете один из них). Если вы пропустите предложение WHERE, все строки таблицы будут возвращены.

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