Эквивалент GroupBy и условие «Наличие» в реляционной алгебре - PullRequest
3 голосов
/ 11 октября 2011

Я выполнял задание, в котором мне приходилось преобразовывать запросы SQL в запросы реляционной алгебры.Я застрял в преобразовании предложения group by.

Может кто-нибудь сказать, как можно написать предложение group by в реляционной алгебре?* Спасибо!

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Отмечая, что вы хотите получить сумму зарплаты, в Tutorial D :

SUMMARIZE emp BY { job } ADD ( SUM ( sal ) AS total_sal )

Примечание. Агрегация не является оператором реляции, следовательно, не будет частью реляционной алгебры.

Что касается HAVING, это историческая аномалия.До появления стандарта SQL-92 было невозможно записать выражения SELECT в предложении FROM (или производные таблицы), т. Е. Всю работу пришлось выполнять в одном выражении SELECT.Из-за жесткого порядка оценки SQL, агрегатное значение не появляется после того, как было оценено предложение WHERE, т.е. было невозможно применить ограничение на основе агрегированных значений.HAVING было введено для решения этой проблемы.

Но даже с HAVING SQL оставался относительно неполным в отношении Кодда, пока не были введены производные таблицы.Производные таблицы представляются HAVING избыточными, но использование HAVING все еще популярно (если Stackoverflow является чем-то необходимым): фолк все еще предпочитает использовать один SELECT, где это возможно, и вышеупомянутую жесткость SQL в отношении порядка вычислений (выполняется последним в выражении SELECT) делает использование производной таблицы довольно многословным по сравнению с HAVING.

1 голос
/ 11 октября 2011

Прежде всего, ваш запрос неверен, вы не можете выбрать то, что не сгруппировали, если не используете агрегацию. Я полагаю, вы хотите получить сумму от суммы.

job F sum (sal), job (emp).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...