2017-01-19 10 views
0

У меня есть запрос с подзапросами в инструкции where, который работает нормально, но мне нужно улучшить его, но я не уверен в лучшем способе этого.Запрос с использованием подзапросов, в котором оператор

В основном я получаю последние лет результатов для студентов в это лет классов. Код ниже отлично работает для classcode '10DRADRA1', но есть еще много классов, и я хочу, чтобы запрос повторялся через все классы для семестра 2017 года. Мне нужно, чтобы класс кода включался как одно из полей вывода. Таким образом, запрос начнется с первого класса и даст все результаты для этого класса, а затем сделает то же самое для следующего класса в подзапросе. Я не уверен, как включить код класса в оператор select рядом со всеми результатами предыдущего года.

Обратите внимание, что в этом году учащиеся могут выполнять ряд классов, поэтому может быть некоторое повторение результатов за предыдущий год. Каждый класс, который они делают в этом году, должен включать имя учащегося и его результаты за предыдущий год. Я жестко запрограммировал «10DRADRA1» только для того, чтобы заставить все работать, если я его удалю, он предоставляет всех учеников в школе только один раз, в то время как я хочу, чтобы каждый класс был один раз и те же результаты для каждого класса, в котором они находятся.

Также не то, что vStudentReportsSemesterResults - это представление, которое содержит все результаты, StudentClasses - это таблица, в которой хранятся коды классов, которые выполняет студент, а SubjectClasses - таблица, содержащая коды для всех классов в школе.

Может ли кто-нибудь посоветовать лучший способ сделать это? Вот мой текущий код.

SELECT  vStudentReportsSemesterResults.StudentID, 
      vStudentReportsSemesterResults.AssessResultsResult, 
      vStudentReportsSemesterResults.AssessAreaHdgAbbrev2, 
      vStudentReportsSemesterResults.FileSemester, 
      vStudentReportsSemesterResults.FileYear, 
      vStudentReportsSemesterResults.ClassLearningAreaCode, 
      vStudentReportsSemesterResults.AssessmentCode, 
      vStudentReportsSemesterResults.StudentNameInternal 

FROM  vStudentReportsSemesterResults 

WHERE  vStudentReportsSemesterResults.StudentID in 
      (
      select StudentClasses.ID from StudentClasses 
      where StudentClasses.filesemester = 1 and 
      StudentClasses.fileyear = 2017 and 
      StudentClasses.classcode in 
       (
       select SubjectClasses.ClassCode from SubjectClasses 
       where SubjectClasses.FileYear = 2017 and 
       SubjectClasses.FileSemester = 1 and 
       SubjectClasses.FileType = 'A' and 
       SubjectClasses.ClassCampus = 'S' and 
       SubjectClasses.ClassCode like '10DRADRA1' 
       ) 
      ) 
      and (vStudentReportsSemesterResults.ClassLearningAreaCode = 'ENG'  OR 
      vStudentReportsSemesterResults.ClassLearningAreaCode = 'MAT' OR 
      vStudentReportsSemesterResults.ClassLearningAreaCode = 'SCI') AND 
      (vStudentReportsSemesterResults.AssessAreaHdgAbbrev2 = 'Grade' OR 
      vStudentReportsSemesterResults.AssessAreaHdgAbbrev2 = 'Level') AND 
      (vStudentReportsSemesterResults.AssessResultsResult <> '') AND 
      (vStudentReportsSemesterResults.FileYear = 2016) AND 
      (vStudentReportsSemesterResults.FileSemester = 4) 
+0

Вы, вероятно, может сделать присоединяется вместо этого, который, по крайней мере некоторые СУБД оптимизировать лучше. – jarlh

+0

Можете ли вы предоставить некоторые данные образца и желаемый результат? –

+0

'StudentClasses.ID' не является идентификатором записи StudentClasses, а для ученика? Или это опечатка? –

ответ

1

Присоединяйтесь StudentClasses к vStudentReportsSemesterResults:

SELECT  
    sc.ClassCode, 
    srsr.StudentID, 
    srsr.AssessResultsResult, 
    srsr.AssessAreaHdgAbbrev2, 
    srsr.FileSemester, 
    srsr.FileYear, 
    srsr.ClassLearningAreaCode, 
    srsr.AssessmentCode, 
    srsr.StudentNameInternal 
FROM vStudentReportsSemesterResults srsr 
JOIN StudentClasses sc 
    ON sc.ID = srsr.StudentID 
    AND sc.FileSemester = 1 
    AND sc.FileYear = srsr.FileYear + 1 
    AND EXISTS 
    (
    select * 
    from SubjectClasses subc 
    where subc.FileYear = sc.FileYear 
     and subc.ClassCode = sc.ClassCode 
     and subc.FileSemester = sc.FileSemester 
     and subc.FileType = 'A' 
     and subc.ClassCampus = 'S' 
) 
WHERE srsr.ClassLearningAreaCode in ('ENG', 'MAT', 'SCI') 
    AND srsr.AssessAreaHdgAbbrev2 in ('Grade', 'Level') 
    AND srsr.AssessResultsResult <> '' 
    AND srsr.FileYear = 2016 
    AND srsr.FileSemester = 4; 
+0

Отлично. это прекрасно работает. Спасибо за вашу помощь. –

0

Это более читаемым:

SELECT  
    ClassCode, 
    StudentID, 
    AssessResultsResult, 
    AssessAreaHdgAbbrev2, 
    ClassLearningAreaCode, 
    AssessmentCode, 
    StudentNameInternal, 
    lr.FileYear, 
    lr.FileSemester, 
    tr.FileYear, 
    tr.FileSemester, 
    tr.FileType, 
    tr.ClassCampus 
FROM   
    vStudentReportsSemesterResults lr 
inner join (
     select ID, sc.ClassCode, sc.FileYear, sc.filesemester, sbjc.FileType, sbjc.ClassCampus 
     from StudentClasses sc 
     INNER JOIN SubjectClasses sbjc ON SC.classcode = sbjc.ClassCode and sc.FileSemester=sbjc.FileSemester and sc.FileYear=sbjc.FileYear 
    ) tr on lr.StudentID = tr.ID 
    and lr.FileYear = tr.FileYear - 1 
WHERE  
    ClassLearningAreaCode IN ('ENG', 'MAT', 'SCI') 
    AND AssessAreaHdgAbbrev2 IN ('Grade', 'Level') 
    AND (AssessResultsResult <> '') 
    AND lr.FileYear = 2016 
    AND lr.FileSemester = 4 
    and tr.FileSemester = 1 
    and tr.FileType = 'A' 
    and tr.ClassCampus = 'S' 
ORDER BY 2,1,5 

В SELECT разделе я добавил некоторые поля, чтобы лучше понять результат.
В пункте WHERE вы можете контролировать, как фильтровать сравнение.

Помещенный некоторые индексы присоединиться и фильтров столбцов и запрос будет работать быстро