我的数据库是这样的 -
学院有多门课程。课程进一步分为多个流。一个流有多个主题,而这些主题又有多个主题。最后,主题,流,主题和主题有多个注释。
课程 - >流 - >主题 - >主题 - >备注
我想写一个选择查询,以获得给定课程中笔记数量的鸟瞰图。 我想要这个 -
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
答案 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