Вопрос

Я не мог получить намек на то, как написать запросы 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)

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


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top