繁体   English   中英

根据SQL Server中的条件检查列值的计数是否等于一

[英]Check the count of column value is equal to one based on condition in sql server

我有两张桌子

学生

StudentId    |  StudentName
----------   |  --------------
1            |  John
2            |  Susan
3            |  Andy
4            |  Joe

StudentId    |    DepartmentId
----------   |    ------------
1            |    123
1            |    234
2            |    123
2            |    456
3            |    123
4            |    456

每个学生可以在多个系中,但是我必须找到那些只在一个系中的学生,例如学生3和4

有什么帮助吗?

使用GROUP BYHAVING

SELECT s.StudentId,s.StudentName
FROM Department d
JOIN Student s ON s.StudentId=d.StudentId
GROUP BY s.StudentId,s.StudentName
HAVING COUNT(d.DepartmentId)=1

如果您还想向学生显示不在部门表中的内容

SELECT s.StudentId,s.StudentName
FROM Department d
RIGHT JOIN Student s ON s.StudentId=d.StudentId
GROUP BY s.StudentId,s.StudentName
HAVING COUNT(d.DepartmentId)<=1

LEFT JOIN变体

SELECT s.StudentId,s.StudentName
FROM Student s
LEFT JOIN Department d ON s.StudentId=d.StudentId
GROUP BY s.StudentId,s.StudentName
HAVING COUNT(d.DepartmentId)<=1

只需加入它们并通过having .. count()函数的Group by子句将它们聚合

SELECT s.StudentId, s.StudentName
FROM student s
     JOIN Department d ON d.StudentId = s.StudentId
GROUP BY s.StudentId, s.StudentName
HAVING COUNT(d.DepartmentId) = 1;

结果:

studentid   studentname 
3           Andy        
4           Joe         

您可以将IN与带有StudentId department表组一起使用,并且在以下子查询中具有count(Student_Id) = 1

SELECT *
FROM student s
WHERE s.StudentId IN (
        SELECT d.StudentId
        FROM Department d
        GROUP BY d.StudentId
        HAVING count(d.DepartmentId) = 1
        );

结果:

+-----------+-------------+
| studentid | studentname |
+-----------+-------------+
|         3 | Andy        |
|         4 | Joe         |
+-----------+-------------+

演示

尝试这个,

SELECT st.StudentId, St.StudentName
FROM student st
     JOIN Department dep ON dep.StudentId = st.StudentId
GROUP BY st.StudentId
HAVING COUNT(dep.DepartmentId) = 1;

另一种方法是通过使用cte表消除一开始具有多个系的学生,然后使用带有IN关键字的表,例如:

with cte as (
   select StudentId
   from Department
   group by StudentId
   having count(StudentId)=1  
)
select *
from Students
where StudentId in (select StudentId from cte)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM