1

次のスキーマの A と B の SQL クエリを記述する方法についてヒントを得ることができませんでした。

Programme (Pid:int, Department:string...)
Employee (Eid:int, Department:string..)
Participation (Pid:int, Eid:int, ..)

A. 全社員参加のプログラム名

B. 彼の部門のすべてのプログラムに参加している従業員の名前。

どんなガイドラインも役に立ちます。

4

3 に答える 3

1

使用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)

繰り返しますが、従業員が参加していない同じ部門にプログラムがないすべての従業員を選択します。


形式論理に精通している場合、これは見慣れたものに見えるかもしれません。一般に、全称量化は否定された存在資格によって定義されます。

于 2011-10-18T07:49:22.097 に答える
1

これらを試したことはありませんが、これは私が考えていることです:

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)
于 2011-10-18T07:32:06.463 に答える