构建特定的SQL查询

时间:2012-06-12 08:13:32

标签: sql

我有三张桌子

    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

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

谢谢你,抱歉这个愚蠢的问题。

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) 

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