Запросы SQL, включающие «для всех» [закрыто
-
25-10-2019 - |
Вопрос
Я не мог получить намек на то, как написать запросы SQL для A и B для следующей схемы.
Programme (Pid:int, Department:string...)
Employee (Eid:int, Department:string..)
Participation (Pid:int, Eid:int, ..)
A. Имена программ приняли участие всех сотрудников
B. Имена сотрудников, участвующих во всех программах его департамента.
Любые рекомендации будут полезны.
Решение
Не пробовал это, но это то, о чем я бы думал:
SELECT pg.Name
FROM Participation AS p INNER JOIN Programme AS pg ON p.Pid = pg.Pid
GROUP BY p.Pid
HAVING COUNT(*) = (SELECT COUNT(*) FROM Employeee)
SELECT e.Name
FROM Participation AS p INNER JOIN Employee AS e ON p.Eid = e.Eid
INNER JOIN Programme AS pg ON pg.Pid = p.Pid
WHERE pg.Department = e.Department
GROUP BY p.Eid, e.Department, e.Name
HAVING COUNT(*) = (SELECT COUNT(*)
FROM Programme AS pg2
WHERE pg2.Department = e.Department)
Другие советы
Реляционный оператор, который вам требуется разделение, широко известно как "Поставщик, который поставляет все детали".
Вещи, которые следует учитывать, - это ли точное разделение или деление с остатками и как справиться с пустым делителем.
Обновление: просто чтобы уточнить, SQL не хватает явного оператора подразделения или ключевого слова **. Однако реляционное разделение может быть достигнуто в SQL с использованием других операторов. Я воздерживаюсь от публикации рабочего примера из -за тега «домашнее задание». Но тот, который я обычно использую, похож на пример «деление с установленными операторами» в эта ссылка.
Обратите внимание, что @Dylan Smith's - это то, что обычно называют «раздел« Селко », а ответ @Tobyodavies использует вариант того, что обычно известно как« подразделение даты »(дата не будет использовать внешнее соединение, а во -вторых. NOT EXISTS
) Но, может быть, они действительно изобрели эти устоявшиеся подходы сами, кто знает? ;)
** То же самое относится ко многим другим реляционным операторам, например, SQL не имеет оператора полу дифференциации, но может быть выполнен с использованием других операторов SQL, например, NOT IN
, NOT EXISTS
, EXCEPT
, так далее.
Использовать WHERE NOT EXISTS
и внешние соединения
Для всех универсальных программ:
SELECT * FROM Programme
WHERE NOT EXISTS (SELECT * FROM
(Participation NATURAL JOIN Programme) LEFT JOIN Employee
USING (Eid,Department)
WHERE Employee.Eid IS NULL)
Это должно быть довольно легко объяснить - выбирает все программы, в которых не участвует сотрудник, не участвующий
Для всех восторженных сотрудников:
SELECT * FROM Employee
WHERE NOT EXISTS (SELECT * FROM
Employee LEFT JOIN Participation
USING (Eid,department)
WHERE Participation.Eid IS NULL)
Опять же - выбирает все занятия, где в одном отделе нет программ, в которых этот сотрудник не участвует.
Это может выглядеть знакомо, если вы вообще знакомы с формальной логикой - универсальная количественная оценка обычно определяется с точки зрения отрицательной экзистенциальной квалификации