0

我的数据库是这样的-

一所大学有多个课程。课程进一步分为多个流。一个流有多个主题,而主题又具有多个主题。最后,一个主题、流、主题和主题有多个注释。

课程 -> 信息流 -> 主题 -> 主题 -> 笔记

我想编写一个选择查询来鸟瞰给定课程中的笔记数量。我要这个 -

MBA(总笔记数 - 5) - 课程

HR(总笔记数 - 5) - 流

Sub A(总笔记数 - 5) - 主题

主题 1(总注释数 - 2) - 主题

主题 2(总注释数 - 3)

在上面的示例中,Sub A 和 Sub B 总共有 5 个音符,这些音符被显示为 HR。

请帮我写这个查询。查询需要非常快。

我正在附上我的脚本。我可以考虑编写多个子查询,但我认为这不是一种优化的方法。

select MC.CourseName,MS.StreamName,MSub.SubjectName,MT.TopicName,MN.NoteName
from Master_Course MC
JOIN Master_Stream MS ON MC.CourseId = MS.CourseId
JOIN Master_Subject MSub ON MS.StreamId = MSub.StreamId
JOIN Master_Topics MT ON MSub.SubjectId = MT.SubjectId
JOIN Master_Notes MN ON MT.TopicId = MN.TopicId
4

3 回答 3

1
select 
 MC.CourseName,
 MCN.NoteCount
 MS.StreamName,
 MS.NoteCount
 MSub.SubjectName,
 MT.TopicName,
 MN.NoteName
from Master_Course MC
JOIN 
   (select MasterCourseID, count(*) as NoteCount
        from Master_Course MC
        JOIN Master_Stream MS ON MC.CourseId = MS.CourseId
        JOIN Master_Subject MSub ON MS.StreamId = MSub.StreamId
        JOIN Master_Topics MT ON MSub.SubjectId = MT.SubjectId
        JOIN Master_Notes MN ON MT.TopicId = MN.TopicId
        JOIN Master_Stream MS ON MC.CourseId = MS.CourseId) MCN 
        on MC.MasterCourseID = MCN.MasterCourseID
 JOIN Master_Subject MSub ON MS.StreamId = MSub.StreamId
JOIN Master_Topics MT ON MSub.SubjectId = MT.SubjectId
JOIN Master_Notes MN ON MT.TopicId = MN.TopicId

请参阅子查询以获取顶级注释计数;您需要对层次结构的每个级别重复此操作。

它应该非常快,因为您正在加入主键并计数;如果它运行得太慢,您可能会在(物化)视图中捕获音符计数逻辑。

于 2013-09-23T14:01:47.557 回答
0

不是 100% 确定这是否是您想要的。但是,您可以在 JOIN 语句后添加以下内容来进行计数:

GROUP BY CourseID, StreamID, SubjectID, TopicID WITH ROLLUP

或者

GROUP BY CourseID, StreamID, SubjectID, TopicID WITH CUBE

这当然是您唯一标识符的猜测名称。ROLLUP 和 CUBE 的区别在于:

ROLLUP 将计算以下组合:

CourseID, StreamID, SubjectID, TopicID
CourseID, StreamID, SubjectID
CourseID, StreamID
CourseID

CUBE 将对给定元素中的一个到所有四个进行所有组合,例如

CourseID
CourseID, SubjectID
StreamID, SubjectID, TopicID
....

因此,如果您仍然需要所有组合,请使用 CUBE,否则使用 ROLLUP。ROLLUP 将为您提供所有唯一课程的计数,所有具有相同 CourseID 和 StreamID(但具有不同 SubjectID 和 TopicID)的唯一组合,等等 CourseID、StreamID 和 SubjectID 以及所有四个。

我希望这是对您问题的回答。

于 2013-09-23T13:33:08.900 回答
0

如果每个表的“ID”是 PK,即优化,只在查询中留下计数:

select count(Master_Notes.columnX) FROM 
from Master_Course MC
JOIN Master_Stream MS ON MC.CourseId = MS.CourseId
JOIN Master_Subject MSub ON MS.StreamId = MSub.StreamId
JOIN Master_Topics MT ON MSub.SubjectId = MT.SubjectId
JOIN Master_Notes MN ON MT.TopicId = MN.TopicId
WHERE Master_Course.columnY = Z
于 2013-09-24T14:41:41.993 回答