(ORACLE SQL) о подзапросе и таких операторах, как ALL, ANY и т. д.

у меня 3 таблицы

CREATE TABLE airships( 
    idas number PRIMARY KEY, 
    nameas varchar2(20), 
    range number 
);

CREATE TABLE Certificate( 
    idem number NOT NULL, 
    idas number NOT NULL, 
    FOREIGN KEY (idem) REFERENCES employees(idem), 
    FOREIGN KEY (idas) REFERENCES airships(idas) 
);

CREATE TABLE employees( 
    idem number PRIMARY KEY, 
    nameem varchar2(20), paycheck number 
);

Я должен найти то же самое для тех сотрудников, которые сертифицированы для наибольшего количества дирижаблей, используя подзапрос и операторы, такие как EXISTS, IN, ALL, ANY.

Мне удалось найти только одного сотрудника, не используя ни одного операто.

Select  *
from (Select idem,count(idas) as AirshipName
      From Certificate
      Group By idem
      Order By count(idas) DESC)
WHERE ROWNUM=1

person Mike B.    schedule 27.11.2014    source источник
comment
Почему вы должны использовать определенные операторы? Это домашнее задание?   -  person Barmar    schedule 27.11.2014
comment
Да. это моя домашняя работа   -  person Mike B.    schedule 27.11.2014
comment
Разве это не означает, что вы должны попытаться разобраться в этом самостоятельно, а не заставлять Интернет делать домашнюю работу за вас? Вот как вы учитесь.   -  person Barmar    schedule 27.11.2014
comment
Да, я должен понять это сам, но это упражнение взято из более крупного проекта, который я должен представить, и я действительно не могу решить его правильно.   -  person Mike B.    schedule 27.11.2014
comment
Я пытался использовать max(count(idas)) Но это не работает   -  person Mike B.    schedule 27.11.2014
comment
Вы не можете использовать две агрегатные функции в одном выражении. Используйте COUNT(idas) в подзапросе и MAX(AirshipName) во внешнем запросе.   -  person Barmar    schedule 27.11.2014
comment
Я все еще не понимаю. 'Select idem,MAX(AirshipName) from (Select idem,count(idas) as AirshipName From Certificate Group By idem Order By count(idas) DESC) Group By idem' возвращает все значения, а не только MAX.   -  person Mike B.    schedule 27.11.2014


Ответы (1)


Я не уверен, как это сделать, используя указанные вами операторы. Вот как это сделать с помощью HAVING

Оператор ALL объясняется здесь. Вы можете использовать этот запрос:

SELECT "idem"
FROM Certificate
GROUP BY "idem"
HAVING COUNT(*) >= ALL (
    SELECT COUNT(*)
    FROM Certificate
    GROUP BY "idem")

ДЕМО

person Barmar    schedule 27.11.2014
comment
Замените HAVING COUNT(*) = (SELECT MAX(num_airships) ...) на HAVING COUNT(*) >= ALL (SELECT num_airships ...) - person ypercubeᵀᴹ; 27.11.2014
comment
@ypercube Спасибо. Мой основной опыт работы с SQL связан с MySQL, я не знал об этой функции Oracle. - person Barmar; 27.11.2014
comment
ALL — это стандартный оператор SQL, но он редко используется кем-либо — разве что в учебниках и домашних заданиях. - person ypercubeᵀᴹ; 27.11.2014
comment
Тем не менее, это позволяет избежать необходимости писать еще один уровень подзапроса. - person Barmar; 27.11.2014
comment
Да, верно. Однако в современных СУБД оконные функции, вероятно, будут более эффективными для такой задачи. - person ypercubeᵀᴹ; 27.11.2014