我无法获得有关如何为以下架构为 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. 参与其部门所有计划的员工姓名。
任何指导方针都会有所帮助。
您需要的关系算子是师,俗称“供应所有零件的供应商”。
要考虑的事情是精确除法还是除法余数以及如何处理空除数。
更新:为了澄清,SQL 缺少明确的除法运算符或关键字**。但是,可以使用其他运算符在 SQL 中实现关系划分。由于“作业”标签,我将避免发布工作示例。但我通常使用的那个类似于此链接上的“使用集合运算符进行除法”示例。
请注意,@Dylan Smith 的通常称为“Celko 的除法”,@tobyodavies 的答案使用了通常称为“日期的除法”的变体(Date 不会使用外连接,而是使用 second NOT EXISTS
)。但也许他们真的自己重新发明了这些行之有效的方法,谁知道呢?;)
** 这同样适用于许多其他关系运算符,例如 SQL 没有半差分运算符,但可以使用其他 SQL 运算符执行,例如NOT IN
, NOT EXISTS
,EXCEPT
等。
没试过这些,但这是我的想法:
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)
使用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)
再次 - 选择在该员工未参与的同一部门中没有计划的所有员工。
如果您完全熟悉形式逻辑,这可能看起来很熟悉 - 普遍量化通常根据否定存在限定来定义