无法对包含聚合或子查询的表达式执行聚合函数。SQL Server
我们在表无法对包含聚合或子查询的表达式执行聚合函数。SQL Server,sql,Sql,我们在表Employee中找到了一些记录。不同的学生与特定的ClassId链接。在屏幕截图中,StudentId5,6属于ClassId1,而StudentId5,6,7属于另一个ClassId2 我想从上面只包含StudentId5和6的表中获取ClassId。因此,在上面的示例中,它应该返回ClassId1。棘手的是,值5和6来自另一个表 所以当我在下面运行查询时,它会抛出一个错误 SELECT ClassId FROM employee GROUP BY ClassId HAVING C
Employee
中找到了一些记录。不同的学生
与特定的ClassId
链接。在屏幕截图中,StudentId
5,6属于ClassId
1,而StudentId
5,6,7属于另一个ClassId
2
我想从上面只包含StudentId
5和6的表中获取ClassId
。因此,在上面的示例中,它应该返回ClassId
1。棘手的是,值5和6来自另一个表
所以当我在下面运行查询时,它会抛出一个错误
SELECT ClassId
FROM employee
GROUP BY ClassId
HAVING COUNT(CASE WHEN StudentId NOT IN (select id from test) THEN 1 END) = 0;
错误:
无法对包含聚合或子查询的表达式执行聚合函数
如果我删除子查询部分,那么它可以正常工作
SELECT ClassId
FROM employee
GROUP BY ClassId
HAVING COUNT(CASE WHEN StudentId NOT IN (5,6) THEN 1 END) = 0;
下面是上面两个表的创建表脚本
CREATE TABLE Student (Id INT)
INSERT INTO Student VALUES (5),(6)
CREATE TABLE Employee
(
Id INT IDENTITY,
ClassId INT,
StudentId INT
)
INSERT INTO employee
VALUES (1, 5), (1, 6), (2, 5), (2, 6), (2, 7)
有人能建议一种解决方法来运行第一个查询而不出错吗?使用
groupby
和如下所示:
SELECT e.ClassId
FROM employee e LEFT JOIN
test t
ON t.StudentId = e.id
GROUP BY e.ClassId
HAVING COUNT(*) = COUNT(t.StudentId) AND -- all rows in `e` match a row in `t`
COUNT(*) = (SELECT COUNT(*) FROM test) -- all match
这是不允许的,但您可以执行左联接
。然后使用coalesce()
检查test
表中没有的项目
select t1.ClassId
from employee t1
left join test t2 on t2.id = t1.StudentId
group by t1.ClassId
having count(case when coalesce(t2.id, 0) = 0 then 1 end)= 0
您可以使用apply来简化HAVING
子句
declare @Student table (ID int) ;
insert into @Student values (5),(6) ;
declare @employee table (ID int identity, ClassId int, StudentId int) ;
insert into @employee values (1,5),(1,6), (2,5),(2,6), (2,7) ;
SELECT e.ClassId AS ClassId , COUNT(e.StudentId)
FROM @employee AS e
CROSS APPLY (
SELECT ID
FROM @Student AS s
WHERE s.ID = e.StudentId
) AS student
GROUP BY e.ClassId
HAVING COUNT(e.StudentId) = (SELECT COUNT('8') FROM @Student) ;
非常感谢您在这方面提供的解决方案。两个答案都有效,所以我们有两种不同的方法来解决这个问题。这就是我需要的。