1

我无法获得有关如何为以下架构为 A 和 B 编写 SQL 查询的提示。

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

A. 全体员工参加的项目名称

B. 参与其部门所有计划的员工姓名。

任何指导方针都会有所帮助。

4

3 回答 3

3

您需要的关系算子是,俗称“供应所有零件的供应商”

要考虑的事情是精确除法还是除法余数以及如何处理空除数。

更新:为了澄清,SQL 缺少明确的除法运算符或关键字**。但是,可以使用其他运算符在 SQL 中实现关系划分。由于“作业”标签,我将避免发布工作示例。但我通常使用的那个类似于此链接上的“使用集合运算符进行除法”示例。

请注意,@Dylan Smith 的通常称为“Celko 的除法”,@tobyodavies 的答案使用了通常称为“日期的除法”的变体(Date 不会使用外连接,而是使用 second NOT EXISTS)。但也许他们真的自己重新发明了这些行之有效的方法,谁知道呢?;)

** 这同样适用于许多其他关系运算符,例如 SQL 没有半差分运算符,但可以使用其他 SQL 运算符执行,例如NOT IN, NOT EXISTS,EXCEPT等。

于 2011-10-18T08:57:50.160 回答
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 回答
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 回答