简单表的SQL查询

时间:2017-09-17 02:01:38

标签: sql

我有一张桌子:

 ( EmployeeID (int), CourseID (int))

是1对多关系。员工可以有很多课程ID。

EmployeeID         
   1                  
   1                  
   2                  
   2                  
   3                  
   3                  
   3       

CourseID            
   1                  
   2                  
   2                  
   3                  
   1                  
   2                  
   3      

例如,我想知道拥有courseID 1和2的员工数量

Select  COUNT([employee ID])
From EmployeeTable
Where courseID = 1 and courseID = 2

答案应为2,因为只有EmployeeID 1和EmployeeID 3具有CourseID 1和2.

3 个答案:

答案 0 :(得分:2)

对FROM子句返回的每一行评估WHERE子句。正如您所知,WHERE子句检查课程ID是否有2个不同的值,这将永远不会评估为true。我看到的解决方案是使用自联接。

SELECT COUNT(*) FROM EmployeeTable AS ET1 JOIN EmployeeTable AS ET2 ON ET1.[employee ID] = ET2.[employeeID] AND ET1.[course 
ID] = 1 AND ET2.[course ID] = 2

这看起来像一个连接表。如果您有一个单独的员工表,则可以使用子查询更轻松地执行某些操作。

答案 1 :(得分:2)

这是使用count distinct选择和统计所有同时拥有课程1和2的员工的快捷方式

select count(*) from (
    select EmployeeID
    from EmployeeTable
    where CourseID in (1,2)
    group by EmployeeID
    having count(distinct CourseID) = 2
) t

答案 2 :(得分:1)

这不是那么简单......你的尝试将返回0,因为没有一行同时具有CourseID = 1和CourseID = 2。

您可以使用子查询来执行此操作:

SELECT COUNT(*) 
FROM EmployeeTable e1
WHERE EXISTS
(
    SELECT *
    FROM EmployeeTable e2
    WHERE e2.CourseID = 1
    AND e2.EmployeeID = e1.EmployeeID
)
AND EXISTS
(
    SELECT *
    FROM EmployeeTable e3
    WHERE e3.CourseID = 2
    AND e3.EmployeeID = e1.EmployeeID
)