2013-09-23 4 views
0

Моя база данных такова:Пожалуйста, помогите найти в этом SQL-запросе

Существует несколько курсов в колледже. Курс далее делится на несколько потоков. В потоке есть несколько объектов, которые, в свою очередь, имеют несколько тем. Наконец, есть несколько заметок для темы, потока, темы и темы.

курс -> Струйные -> Предметы -> Темы -> Заметки

Я хочу написать запрос на выборку, чтобы получить высоты птичьего полета количество нот в данном курсе. Я хочу это -

MBA (Всего Notes Count - 5) - Курс

HR (Всего Notes Count - 5) - Streams

Sub A (Всего Notes Count - 5) - Тема

темы 1 (Все Примечание Count - 2) - тема

тема 2 (Все Примечание Count - 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

простого соединение не будет делать ... нет необходимости делать какую-либо хитрую вещь, которую я предполагаю, внешний вид прямо. – johnny

+1

Не могли бы вы изложить определения таблиц и ожидаемый результат? Правильно ли, что вы хотите увидеть количество заметок на всех уровнях иерархии? Если это так, вам нужно будет выполнить внешние подключения в подзапросах. Я бы не стал беспокоиться о производительности, пока вы не вернете ему нужные данные. –

+0

Я отредактировал свой вопрос. Я на самом деле хочу знать счет для каждого курса, потока, темы и темы. – Lakshay

ответ

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 

См. Подзапрос для получения подсчета очков верхнего уровня; вам нужно будет повторить это для каждого уровня иерархии.

Это должно быть довольно быстро, поскольку вы присоединяетесь к первичным ключам и подсчитываете; если он работает слишком медленно, вы можете записать логику счетчика заметок в (материализованном) представлении.

0

Не на 100% уверены, что это то, что вы хотите. Тем не менее, вы можете получить некоторый подсчет добавив следующее после вашего РЕГИСТРИРУЙТЕСЬ заявление:

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 и всех четырех.

Я надеюсь, что это ответ на ваш вопрос.

0

Если «ID» каждая таблица ПК, который оптимизирован, только оставили подсчет в запросе:

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 
Смежные вопросы