我无法得到关于如何为以下架构为A和B编写SQL查询的提示。
Programme (Pid:int, Department:string...)
Employee (Eid:int, Department:string..)
Participation (Pid:int, Eid:int, ..)A.所有雇员参加的方案名称 参加本部门所有项目的员工名单。
任何准则都是有帮助的。
发布于 2011-10-18 07:32:06
我还没有试过这些,但我会这么想:
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-18 08:57:50
您需要的关系运算符是分部,俗称供应所有零件的供应商。
要考虑的问题是精确除法还是带余数的除法,以及如何处理空除数。
更新:为了澄清起见,SQL缺少明确的除法操作符或关键字**。但是,可以使用其他操作符在SQL中实现关系划分。由于“家庭作业”标签,我将避免张贴一个工作示例。但是我通常使用的例子类似于此链接中的“带集合操作符的除法”。
请注意,@Dylan是俗称的"Celko's除法“,@tobyodavies的答案使用了一种与俗称的"Date's除法”不同的方法(Date不使用外部联接,而是使用第二个NOT EXISTS)。但也许他们自己确实重新发明了这些既定的方法,谁知道呢?)
**这同样适用于许多其他关系运算符,例如SQL没有半差运算符,但可以使用其他SQL运算符(如NOT IN、NOT EXISTS、EXCEPT等)来执行。
发布于 2011-10-18 07:49:22
使用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)再次-选择在同一部门中没有该员工未参与的项目的所有雇用人员。
如果您熟悉所有形式的逻辑,这可能看起来很熟悉--通用量化通常是用否定的存在限定来定义的。
https://stackoverflow.com/questions/7803775
复制相似问题