Сочетание как и существует? - PullRequest
0 голосов
/ 16 мая 2018

Вот база данных, которую я использую: https://drive.google.com/file/d/1ArJekOQpal0JFIr1h3NXYcFVngnCNUxg/view?usp=sharing

Найдите статьи, название которых содержит строку «данные» и где находится хотя бы один автор из отдела с Дептнум 100. Перечислите панам и название этих работ. Вы должен использовать оператор EXISTS. Убедитесь, что ваш запрос нечувствителен к регистру.

Я не уверен, как вывести общее количество статей для каждого академика.

Моя попытка ответить на этот вопрос:

SELECT panum, title
FROM department NATURAL JOIN paper
WHERE UPPER(title) LIKE ('%data%') AND EXISTS (SELECT deptnum FROM 
department WHERE deptnum = 100);

Это кажется пустым. Я не уверен, что я делаю неправильно, можно ли комбинировать LIKE и EXISTS?

Спасибо.

Ответы [ 4 ]

0 голосов
/ 16 мая 2018
select p.TITLE,p.PANUM   from PAPER p where TITLE   like '%data%'
AND EXISTS( 
SELECT * FROM AUTHOR a join ACADEMIC d
      on d.ACNUM=a.ACNUM where d.DEPTNUM=100 AND a.PANUM=p.PANUM)
0 голосов
/ 16 мая 2018

Поскольку они требуют EXISTS, оператор должен быть применен к author, а не к department таблице. Запрос внутри EXISTS должен быть соотнесен с запросом на бумаге, поэтому на верхнем уровне не должно быть JOIN:

SELECT p.PANUM, p.TITLE
FROM paper p
WHERE p.Title LIKE ('%data%') AND EXISTS (
    SELECT *
    FROM author a
    JOIN academic ac ON ac.ACNUM=a.ACNUM
    WHERE a.PANUM=p.PANUM AND ac.DEPTNUM=100
)

Обратите внимание: поскольку в таблице author отсутствует DEPTNUM, вам необходимо объединение внутри запроса EXISTS, чтобы вывести строку academic для столбца DEPTNUM.

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

Фраза UPPER(title) LIKE ('%data%') никогда не найдет никаких строк, поскольку заглавная версия того, что находится в заголовке, никогда не будет содержать строчных букв data.

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

Не используйте natural join! Это мерзость, потому что она не использует явно объявленные отношения внешнего ключа. Явно перечислите ваши join ключи, чтобы запросы были более понятными и более понятными.

Тем не менее, ваш подзапрос является проблемой. Я ожидал бы запрос, похожий на этот:

SELECT p.panum, p.title
FROM paper p
WHERE lower(p.title) LIKE '%data%' AND
      EXISTS (SELECT 1
              FROM authors
              WHERE a.author = p.author AND -- or whatever the column should be
                    a.deptnum = 100
             );
...