2016-10-12 4 views
-1

Извинения, но у меня мало опыта программирования SQL, и мне нужно выяснить, почему мой SQL-запрос не работает ... Я пытался воспользоваться этим!Oracle SQL Programming Query

Файл БД 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, фамилию и имя этих ученых, отсортированные по имени, а затем по дате.

    select A.acnum, A.givename, A.famname, INTEREST.FIELDNUM 
    from ACADEMIC A, INTEREST 
    where A.ACNUM = INTEREST.ACNUM 
    having count (Interest.acnum) > 1; 
    

Что-то вроде этого?

  1. Мне нужно найти, есть ли какие-либо области исследований, в которых ни один академик не интересуется? Мне нужно напечатать общее количество полей исследований, подобных этому. Я считаю, что запрос использует оператор SET.

  2. Мне нужно найти области исследований, которые имеют наибольшее количество заинтересованных ученых. Мне нужно вывести fieldnum и количество заинтересованных ученых.

+0

Показать, что вы пытались – Jens

+0

Unrelated, но: прекратить использование древних, устаревшее и хрупкая неявное присоединяется в пункте Ehre THW и начать использовать явный 'JOIN' оператора. –

ответ

0

Схема не совсем ясно для меня, но здесь является отправной точкой:

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; 
+0

Блестящий! Спасибо! –

+0

Добро пожаловать! – Sebz