#sql #database #relational-database #relational-algebra #relational-division
#sql #База данных #реляционная база данных #реляционная алгебра #реляционное разделение
Вопрос:
Мой запрос включает в себя наличие и количество или все. Как они представлены в RA / DRC / TRC? Должен ли я еще больше упростить свой SQL-запрос? Вот упрощенный пример:
empl(employee (primary key), city)
managers(employee (primary key), manager (foreign key of employee))
Если бы я нашел всех сотрудников, которые являются менеджерами (из любого города) ВСЕХ сотрудников в городе X.. Мне нужно было бы использовать having / count. Не уверен, как это будет сделано в RA / DRC / TRC.
Я знаю, что необходимость такого запроса может не иметь смысла, но предполагаю, что это разумно для целей этого вопроса.
Спасибо
Комментарии:
1. Подробнее о реляционном разделении см. В этой статье
2. Какой вопрос вы задаете — заголовок сообщения или текст сообщения? Какие версии RA / DRC / TRC? Что именно означает «представлен в»? Что вы можете сделать, следуя какой ссылке?
Ответ №1:
Ваш запрос был сформулирован немного двусмысленно. Действительно, цель состоит в том, чтобы найти всех менеджеров, которые являются менеджерами для КАЖДОГО сотрудника, который находится в городе X?
Как указал dportas, это вполне выполнимо в RA.
Вот как :
Получите коллекцию всех сотрудников в городе X. Вызовите это EMPX.
Получите коллекцию всех менеджеров. Вызовите этот MGRS.
Сделайте декартово произведение двух. Вызовите это MGRS_EMPX.
Вычтите из этого фактическое значение таблицы (соответствующим образом спроецированное до необходимых атрибутов), в котором указано, какие менеджеры управляют каким сотрудником. Это различие содержит все комбинации менеджеров, которые действительно существуют, с сотрудником, который находится в X, но где этот менеджер не управляет этим сотрудником.
Спроецируйте это различие на атрибут manager. Это отношение сообщает вам, какие менеджеры существуют, так что в городе X существует какой-то сотрудник, которым НЕ управляет этот менеджер.
Вычтите это отношение из MGRS. Очевидно, что это отношение сообщает вам, какие менеджеры существуют, так что НЕ существует сотрудника, расположенного в городе X, которым НЕ управляет этот менеджер.
Переписывание этого отрицания экзистенциального квантора в качестве универсального квантификатора покажет, что это именно тот результат, который вы хотите: НЕ СУЩЕСТВУЕТ (EMP : EMP находится в X, а EMP управляется MGR) === ДЛЯ ВСЕХ EMP: НЕТ (EMP находится в X, а EMP управляется MGR) === ДЛЯ ВСЕХEMP : (EMP отсутствует в X ИЛИ EMP управляется MGR) === ДЛЯ ВСЕХ EMP: (если EMP находится в X, тогда EMP управляется MGR).
И все это совершенно точные операции алгебры.
(Дополнительное упражнение: посмотрите, что произойдет, если в городе X вообще нет сотрудников.)
Комментарии:
1. Отличный ответ. Подробный и информативный. Премного благодарен, добрый сэр!
Ответ №2:
Реляционное разделение — это ответ на ваш конкретный пример — вам не нужен агрегат. Разделение является частью алгебры.
Ваш более общий вопрос является сложным из-за проблем определения того, когда любой возможный результат SQL совпадает с реляционным. Является ли SQL-запрос, возвращающий повторяющиеся строки, эквивалентным реляционному выражению, которое этого не делает? Является ли SQL-запрос с нулевыми значениями в стиле SQL эквивалентным любому реляционному выражению? Как вы выражаете реляционную проекцию без атрибутов, используя только синтаксис SQL?
Я думаю, что единственный разумный ответ — сказать, что модель SQL и реляционная — это две совершенно разные и несовместимые вещи. Вероятно, вам не стоит слишком усердно искать соответствия между ними.
Комментарии:
1. Как бы я использовал разделение в этом случае? Вы имеете в виду разницу в наборе?
2. Менеджеры РАЗДЕЛЯЮТ (ОГРАНИЧИВАЮТ (city =’x’) Empl)
Ответ №3:
Комментарии:
1. Верно, но утверждение OP: «Мне нужно было бы использовать having / count», является ложным.
Ответ №4:
возможно, вы упростили свой вопрос.. но поиск менеджера для сотрудников в городе X — это простое объединение — без учета или наличия.
Редактировать:
select *
from managers m,
( select employee from empl where city = 'XXXXX' ) e
where m.employee = e.employee
Комментарии:
1. Привет, Рэнди, спасибо за комментарий. Запрос состоит в том, чтобы найти менеджеров (которые могут быть в разных городах) ВСЕХ сотрудников city X.
2. Рэнди, твой запрос даст менеджерам ЛЮБЫХ (1 или более) сотрудников в городе X. В примере вопроса запрашиваются менеджеры ВСЕХ сотрудников в городе X. Например, если в городе X было три сотрудника, E1 E2 и E3.. Предположим, что M1 является менеджером E1, E2, E3, а M2 является менеджером только E2, E3.. Таблица будет возвращать только M1
3. И он использует SQL-антипаттерн неявного синтаксиса, который является очень плохой техникой программирования, и нет никаких оправданий для использования в 21 веке
4. @John Smith — хорошо, я не понял этого из вашего первоначального сообщения.