次のスキーマの A と B の SQL クエリを記述する方法についてヒントを得ることができませんでした。
Programme (Pid:int, Department:string...)
Employee (Eid:int, Department:string..)
Participation (Pid:int, Eid:int, ..)
A. 全社員参加のプログラム名
B. 彼の部門のすべてのプログラムに参加している従業員の名前。
どんなガイドラインも役に立ちます。
次のスキーマの A と B の SQL クエリを記述する方法についてヒントを得ることができませんでした。
Programme (Pid:int, Department:string...)
Employee (Eid:int, Department:string..)
Participation (Pid:int, Eid:int, ..)
A. 全社員参加のプログラム名
B. 彼の部門のすべてのプログラムに参加している従業員の名前。
どんなガイドラインも役に立ちます。
使用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)
繰り返しますが、従業員が参加していない同じ部門にプログラムがないすべての従業員を選択します。
形式論理に精通している場合、これは見慣れたものに見えるかもしれません。一般に、全称量化は否定された存在資格によって定義されます。
これらを試したことはありませんが、これは私が考えていることです:
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)