Могут ли все запросы SQL быть представлены в реляционной алгебре, домене и реляционном исчислении кортежей?

Мой запрос включает наличие и количество или все включено. Как они представлены в RA/DRC/TRC? Придется ли мне еще больше упростить мой SQL-запрос? Вот упрощенный пример:

empl(employee (primary key), city)
managers(employee (primary key), manager (foreign key of employee))

Если бы мне нужно было найти всех сотрудников, которые являются менеджерами (из любого города) ВСЕХ сотрудников в городе X.. Мне нужно было бы использовать have/count. Не уверен, как это будет сделано в РА/ДРК/КИП.

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

Спасибо


person Community    schedule 11.10.2011    source источник
comment
comment
Какой вопрос вы задаете - заголовок сообщения или тело сообщения? Какие версии RA/DRC/TRC? Что именно означает представленный в? Что вы можете сделать, следуя какой ссылке?   -  person philipxy    schedule 12.08.2019


Ответы (4)


Ваш запрос был сформулирован немного двусмысленно. Это действительно намерение найти всех менеджеров, которые являются менеджерами для КАЖДОГО служащего в городе X?

Как указали dportas, это вполне выполнимо в RA.

Вот как :

Соберите всех сотрудников в городе X. Назовите это EMPX.

Получить коллекцию всех менеджеров. Назовите это MGRS.

Сделайте декартово произведение двух. Назовите это MGRS_EMPX.

Вычтите из этого фактическое значение таблицы (соответственно спроецированное на необходимые атрибуты), в которой указано, какие менеджеры управляют каким сотрудником. Эта разница содержит все реально существующие комбинации менеджеров с сотрудником, который находится в X, но где этот менеджер не управляет этим сотрудником.

Спроецируйте эту разницу на атрибут менеджера. Это отношение сообщает вам, какие менеджеры существуют, так что в городе X есть какой-то сотрудник, которым НЕ управляет этот менеджер.

Вычтите это отношение из MGRS. Очевидно, что это отношение сообщает вам, какие менеджеры существуют, так что НЕ существует сотрудника, расположенного в городе X, который НЕ управляется этим менеджером.

Переписав это отрицание квантификатора существования в качестве универсального квантификатора, вы обнаружите, что это именно тот результат, который вам нужен: НЕ СУЩЕСТВУЕТ (ЭМИ: ЭМИ находится в X И ЭМИ управляется MGR) === FORALL EMP: НЕ (ЭМИ находится в X И EMP управляется MGR) === FORALL EMP : (EMP не находится в X ИЛИ EMP управляется MGR) === FORALL EMP : (если EMP находится в X, то EMP управляется MGR).

И все это совершенно прекрасные алгебраические операции.

(Дополнительное упражнение: посмотрите, что произойдет, если в городе X вообще не будет сотрудников.)

person Erwin Smout    schedule 11.10.2011
comment
Отличный ответ. Тщательно и информативно. Премного обязан, милостивый государь! - person ; 16.10.2011

Relational Division - это ответ на ваш конкретный пример - вам не нужен агрегат. Деление является частью алгебры.

Ваш более общий вопрос сложен из-за проблем с определением того, когда любой возможный результат SQL совпадает с реляционным. Является ли SQL-запрос, который возвращает повторяющиеся строки, эквивалентным реляционному выражению, которое этого не делает? Является ли SQL-запрос с нулями в стиле SQL эквивалентным какому-либо реляционному выражению? Как выразить реляционную проекцию без атрибутов, используя только синтаксис SQL?

Я думаю, что единственный разумный ответ - сказать, что модель SQL и реляционная модель - это две совершенно разные и несовместимые вещи. Вы, вероятно, не должны слишком усердно искать соответствия между ними.

person nvogel    schedule 11.10.2011
comment
Как бы я использовал деление в этом случае? Вы имеете в виду разницу в наборах? - person ; 12.10.2011
comment
Менеджеры DIVIDE (RESTRICT(city='x') Empl) - person nvogel; 12.10.2011

Агрегированные запросы не выражаются в РА.

person Tegiri Nenashi    schedule 11.10.2011
comment
Верно, но утверждение ОП, что мне нужно было бы использовать наличие/счет, неверно. - person onedaywhen; 20.10.2011

может быть, вы упростили свой вопрос ... но найти менеджера для сотрудников в городе X - это простое присоединение - без подсчета или наличия.

редактировать:

select  * 
from managers m,
( select employee from empl where city = 'XXXXX' ) e
where m.employee = e.employee
person Randy    schedule 11.10.2011
comment
Привет, Рэнди, спасибо за комментарий. Запрос состоит в том, чтобы найти руководителей (которые могут находиться в разных городах) ВСЕХ сотрудников города X. - person ; 12.10.2011
comment
Рэнди, ваш запрос даст менеджеров ЛЮБЫХ (1 или более) сотрудников в городе X. Пример вопроса задает менеджеров ВСЕХ сотрудников в городе X. Например, если в городе X было три сотрудника, E1 E2 и E3. Предположим, M1 является менеджером E1, E2, E3, а M2 является менеджером только E2, E3.. Таблица будет возвращать только M1 - person ; 12.10.2011
comment
И он использует антипаттерн SQL с неявным синтаксисом, который является очень плохой техникой программирования, и нет оправдания его использованию в 21 веке. - person HLGEM; 12.10.2011
comment
@John Smith - хорошо, я не понял этого из твоего исходного поста. - person Randy; 12.10.2011