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

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

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

Если бы я должен был найти всех сотрудников, являющихся менеджерами (из любого города) ВСЕХ сотрудников в городе X ... Мне нужно было бы использовать наличие / количество Не уверен, как это будет сделано в RA / DRC / TRC.

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 12 октября 2011

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

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

Вот как:

Получить сбор всех сотрудников в городе X. Позвоните в EMPX.

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

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

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

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

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

Переписывание этого отрицания экзистенциального квантификатора как универсальной квантификации покажет, что этоэто именно тот результат, который вам нужен: NOT EXISTS (EMP: EMP находится в X, а EMP управляется MGR) === FORALL EMP: НЕ (EMP находится в X, а EMP управляется MGR) === FORALL EMP: (EMPне в X, ИЛИ EMP управляется MGR) === FORALL EMP: (если EMP находится в X, тогда EMP управляется MGR).

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

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

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

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

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

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

1 голос
/ 12 октября 2011
0 голосов
/ 12 октября 2011

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

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

select  * 
from managers m,
( select employee from empl where city = 'XXXXX' ) e
where m.employee = e.employee
...