请帮助这个SQL查询

时间:2013-09-23 13:04:13

标签: sql database

我的数据库是这样的 -

学院有多门课程。课程进一步分为多个流。一个流有多个主题,而这些主题又有多个主题。最后,主题,流,主题和主题有多个注释。

课程 - >流 - >主题 - >主题 - >备注

我想写一个选择查询,以获得给定课程中笔记数量的鸟瞰图。 我想要这个 -

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

3 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分: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以及所有四个。

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

答案 2 :(得分: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