#sql #oracle
#sql #Oracle
Вопрос:
Прошу прощения, но у меня мало опыта программирования на SQL, и мне нужно выяснить, почему мой SQL-запрос не работает…Я безуспешно пытался разобраться с этим!
Файл SQL базы данных, расположенный здесь
Схема базы данных выглядит следующим образом:
DEPARTMENT(deptnum, descrip, instname, deptname, state, postcode)
ACADEMIC(acnum, deptnum*, famname, givename, initials, title)
PAPER(panum, title)
AUTHOR(panum*, acnum*)
FIELD(fieldnum, id, title)
INTEREST(fieldnum*, acnum*, descrip)
По сути, я пытаюсь выяснить следующее и сталкиваюсь с некоторыми реальными проблемами:
-
Необходимо найти ученых, которые имеют более 1 исследовательского интереса. Мне нужно перечислить acnum, famname и givename этих ученых, отсортированных по famname, а затем по givename.
select A.acnum, A.givename, A.famname, INTEREST.FIELDNUM from ACADEMIC A, INTEREST where A.ACNUM = INTEREST.ACNUM having count (Interest.acnum) > 1;
Что-то вроде этого?
-
Мне нужно найти, есть ли какие-либо области исследований, в которых нет академиков, которые не интересуют? Мне нужно вывести общее количество полей исследования, подобных этому. Я полагаю, что в запросе используется оператор SET .
-
Мне нужно найти области исследований, в которых наибольшее количество заинтересованных ученых. Мне нужно вывести fieldnum и количество заинтересованных ученых.
Комментарии:
1. Покажите, что вы пробовали
2. Не связано, но: прекратите использовать древние, устаревшие и хрупкие неявные объединения в предложении ehre и начните использовать явный
JOIN
оператор.
Ответ №1:
Схема мне не совсем понятна, но вот отправная точка:
1) Первый:
SELECT a.acnum, a.famname ,a.givename, count(i.fieldnum)
FROM ACADEMIC a INNER JOIN INTEREST i ON a.acnum = i.acnum
GROUP BY a.acnum, a.famname ,a.givename
HAVING COUNT(i.fieldnum) > 1
ORDER BY a.famname ,a.givename;
2) Если вам просто нужно их количество:
SELECT COUNT(1)
FROM FIELD f
WHERE NOT EXISTS(SELECT 1
FROM ACADEMIC a
INNER JOIN INTEREST i ON a.acnum = i.acnum
WHERE f.fieldnum = i.fieldnum);
3) Это немного нечетко, потому что я не знаю, что на самом деле означает самый большой, но вот отсортированный список:
SELECT f.fieldnum, count(a.acnum) as number_of_interested_academics
FROM FIELD f
INNER JOIN INTEREST i ON f.fieldnum = i.fieldnum
INNER JOIN ACADEMIC a ON i.acnum = a.acnum
GROUP BY f.fieldnum
ORDER BY count(a.acnum) DESC;
Комментарии:
1. Блестяще! Большое спасибо!