为什么不加入辅助选择?与其他解决方案不同,这不会为每个返回的行启动子查询,而是一次为所有人收集注册数据。语法可能不完全正确,但您应该明白。
SELECT
s.student_name,
s.student_email,
IsNull(e.enrollment_count, 0)
FROM
Students s
LEFT OUTER JOIN (
SELECT
student_id,
count(*) as enrollment_count
FROM
enrollments
WHERE
active = 1
GROUP BY
student_id
) e
ON s.student_id = e.student_id
从注册选择也可以重做一个函数,它返回一个表供您加入。
CREATE FUNCTION getAllEnrollmentsGroupedByStudent()
RETURNS @enrollments TABLE
(
student_id int,
enrollment_count int
) AS BEGIN
INSERT INTO
@enrollments
(
student_id,
enrollment_count
) SELECT
student_id,
count(*) as enrollment_count
FROM
enrollments
WHERE
active = 1
GROUP BY
student_id
RETURN
END
SELECT
s.student_name,
s.student_email,
e.enrollment_count
FROM
Students s
JOIN
dbo.getAllEnrollmentsGroupedByStudent() e
ON s.student_id = e.student_id
编辑:
Renze德瓦尔纠正我的坏SQL!
如果您有1000名学生,则该声明就像运行1001个查询一样,因为它会分别查询每个学生的入学人数。 – banjollity 2009-03-08 09:43:44
不,这并不坏。数据库可以优化,特别是如果student_id是注册索引的第一部分(我认为这将是)。子查询只需要对注册索引执行索引范围扫描(不需要表本身)。 – 2009-03-16 16:11:08