1

我有三张桌子

    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

好的,问题是,我怎么知道(通过查询)哪个员工在所有项目中工作。我似乎无法将多与多进行比较。

谢谢你,很抱歉提出一个愚蠢的问题。

4

3 回答 3

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表中选择具有当前员工的记录SSN。如果您必须用某种编程语言编写它,这在逻辑上等同于foreach在员工集合上循环,在循环的主体中,您从Works_On表中选择当前员工的所有记录,然后将其与项目总数进行比较。如果当前员工的项目数等于项目总数,则计算它。

我希望这有帮助。

于 2012-06-12T08:20:28.303 回答
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
于 2012-06-12T08:21:25.167 回答
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) 

这不是有史以来最漂亮的查询,但它似乎有效。

于 2012-06-12T08:56:52.183 回答