Программный запрос Oracle SQL

#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. Необходимо найти ученых, которые имеют более 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; 
      

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

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

  2. Мне нужно найти области исследований, в которых наибольшее количество заинтересованных ученых. Мне нужно вывести 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. Блестяще! Большое спасибо!