Трехуровневый иерархический SQL-запрос

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

Я использую элемент управления Telerik TreeView для отображения данных, связанных со школьной доской, со следующей структурой:

--School "ABC"
----Class "Grade 1"
----Class "Grade 2"
------Student #1
------Student #2
--School "DEF"
----Class "Grade 1"
------Student #3
----Class "Grade 3"

TreeView находится в режиме флажка с тремя состояниями, поэтому каждый элемент может быть отмечен. Таким образом, если проверяется один дочерний элемент, родительский элемент также будет проверен, а при проверке родительского элемента будут проверены все дочерние элементы.

После отметки некоторых школ, классов и учеников на следующем экране отображается информация об учениках на графике, который в настоящее время использует идентификаторы школ (если отмечено несколько) для выбора всех учащихся этих школ.

Вот где это становится сложно. Используя вышеприведенную структуру в качестве примера, я выбираю класс 1 из школьного ABC и класс 3 из школьного DEF, который, в свою очередь, выберет учеников №1 и №2 И школы ABC и DEF.

Выбранные школы: ABC, DEF

Выбранные классы: 1 класс, 3 класс

Выбранные студенты: №1, №2

Как упоминалось ранее, мой текущий SQL-запрос основан исключительно на идентификаторе школы, и я знаю, что не могу просто добавить два других условия в предложение where, которые выглядят следующим образом:

AND ClassID IN ('Grade 1', 'Grade 3') --Note there is no primary key for classes, and I can't change that in my position..
AND StudentID IN (1,2)

так как это также выберет учащегося № 3 из другого класса с названием класса 1.

Итак, мой вопрос заключается в том, как объединить идентификаторы школ, имена классов и идентификаторы учащихся в одно условие, которое решит эту проблему.

Изменить:

Вот структура таблиц.

введите здесь описание изображения


person MPaul    schedule 04.08.2015    source источник
comment
Вы хотите написать SQL-запрос, который будет возвращать все классы на основе списка школ и всех учащихся на основе списка классов? У вас не может быть SELECT, который вернет всех дочерних элементов, поскольку классы и учащиеся относятся к разным таблицам.   -  person halfer    schedule 13.09.2015


Ответы (1)


Если я вас правильно понял, у вас есть выбранная школа, класс и ученик. Так будет ли это работать для вас:

where (school = "ABC" and 
        class = "Grade1") 
   OR
      (school = "DEF" and 
        class = "Grade3")

Надеюсь, я правильно понял ваши требования.

person MarioAna    schedule 04.08.2015
comment
К сожалению, он должен быть динамичным. В школьном совете 64 школы (более 1000 классов), и в зависимости от того, кто получает доступ к системе, этому пользователю будут видны только определенные школы, классы и ученики. - person MPaul; 04.08.2015
comment
Хорошо, я понял, не могли бы вы отредактировать свой вопрос с помощью структуры таблицы, которую вы используете. Похоже, вам понадобится предложение CONNECT BY для этого. - person MarioAna; 04.08.2015