我有三张桌子
Employee
SSN Name
1 a
2 b
3 c
Projects
Pno Name
1 x
2 y
3 z
Works_On
ESSN Pno
1 1
1 2
2 1
3 1
3 2
3 3
好的问题是,我怎么知道(通过查询)哪个员工在所有项目上工作。我似乎无法比较多与多。
谢谢你,抱歉这个愚蠢的问题。
答案 0 :(得分:4)
这样做的一种方法是统计所有项目,计算员工的项目数量,然后选择所有从事相同数量项目的员工:
DECLARE @ProjectCount int
SELECT @ProjectCount = Count(*) FROM Projects
SELECT e.*
FROM Employee e
WHERE (SELECT COUNT(1) FROM Works_On w WHERE w.ESSN = e.SSN) = @ProjectCount
ProjectCount
变量可以跳过每个员工的计算项目。
更新:工作原理:
对于每位员工,计算Works_On
表中字段ESSN
等于当前员工SSN
的记录数,然后将该数字与项目总数进行比较。
查询:
SELECT COUNT(1) FROM Works_On
将为您提供Works_On
表中的记录总数(在您的情况下为6)。我们想要计算每个员工有多少记录,这就是我们在主查询中嵌入该查询的条件,以便仅选择具有当前员工Works_On
的{{1}}表中的记录。如果你不得不用某种编程语言写这个,这在逻辑上等同于雇员集合上的SSN
循环,在循环体中你从foreach
表中为当前员工选择所有记录,然后比较它项目总数。如果当前员工的项目数量等于项目总数,请计算它。
我希望这会有所帮助。
答案 1 :(得分:0)
我会在count
上工作。
SELECT e.SSN
FROM Employee e,
(SELECT w.ESSN, COUNT(*) AS count FROM Works_On w WHERE w.ESSN = e.SSN GROUP BY w.ESSN) wcount,
(SELECT COUNT(*) AS count FROM Projects) p -- you can avoid this by calculating it before.
WHERE wcount.ESSN = e.SSN
AND p.count = wcount.count
答案 2 :(得分:0)
试试这个:
SELECT Employee.Name, Projects_On
FROM (
SELECT Works_On.ESSN, COUNT(*) AS [Projects_On]
FROM [Works_On] INNER JOIN [Projects] ON Projects.Pno = Works_On.PNO
GROUP BY [ESSN]) A
INNER JOIN Employee ON Employee.SSN = Essn
WHERE Projects_On = (SELECT COUNT(*) FROM Projects)
这不是最漂亮的查询,但似乎有效。