2

我有一个学生表和一个招生表;一个学生可以有多个注册记录,这些记录可以是活动的,也可以是非活动的。

我想得到一个选择,它有一个学生记录和一个关于该学生是否有活跃注册的指标。

我曾考虑在一个内联 UDF 中执行此操作,该 UDF 使用学生 ID 连接到注册表,但我想知道是否有更好的方法在单个 select 语句中执行此操作。

UDF 调用可能类似于:

Select Student_Name,Student_Email,isEnrolled(Student_ID) from Student

替代方案(使用一条 SQL 语句)可能是什么样的?

4

5 回答 5

1
select  Student_Name,
        Student_Email,
        (select count(*) 
         from Enrollment e 
         where e.student_id = s.student_id
        ) Number_Of_Enrollments 
 from Student e

将获得注册人数,这应该会有所帮助。

于 2009-03-03T22:38:14.427 回答
1

为什么不加入辅助选择?与其他解决方案不同,这不是为返回的每一行触发子查询,而是一次为每个人收集注册数据。语法可能不太正确,但你应该明白了。

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 de Waal 纠正了我的错误 SQL!

于 2009-03-03T22:47:03.517 回答
0

尝试这样的事情:

SELECT Student_Name, Student_Email, CAST((SELECT TOP 1 1 FROM Enrollments e WHERE e.student_id=s.student_id) as bit) as enrolled FROM Student s

我认为您也可以在 select 中使用 exists 语句但不是肯定的

于 2009-03-03T22:21:04.547 回答
0

尽量避免使用 udf 或子查询,它们是性能杀手。banjolity 似乎有一个很好的解决方案,因为它使用派生表而不是 UDF 或子选择。

于 2009-03-03T22:50:49.717 回答
0
  select students.name, 
decode(count(1), 0, "no enrollments", "has enrollments")
     from students, enrollments 
     where 
       students.id = enrollments.sutdent_id and 
       enrollments.is_active = 1 group by students.name

当然,将 decode 替换为您的数据库使用的函数(或 case 语句)。

于 2009-03-03T23:43:33.583 回答