Может ли EXISTS сделать этот запрос более эффективным? - PullRequest
2 голосов
/ 31 мая 2011

Я хочу получить только студентов, которые имеют неприемлемые оценки. Мой оригинальный запрос:

SELECT ssm.STUDENT_ID,COUNT(srcg.GRADE_TITLE) AS POSTED_GRADES
    FROM STUDENT_ENROLLMENT ssm, STUDENT_REPORT_CARD_GRADES srcg
    WHERE ssm.SYEAR='2010' 
    AND ssm.SCHOOL_ID='12' 
    AND ssm.GRADE_ID IN ('140','141','142','143','144','145')
    AND srcg.STUDENT_ID=ssm.STUDENT_ID 
    AND srcg.SYEAR='2010' 
    AND srcg.SCHOOL_ID='12' 
    AND srcg.MARKING_PERIOD_ID='434' 
    AND srcg.GRADE_TITLE IN ('1','2','F','D')               
    GROUP BY ssm.STUDENT_ID;

но мне плевать на счет; Я только хочу найти студентов, которые имеют плохие оценки. Я пытался альтернативный запрос:

SELECT ssm.STUDENT_ID
    FROM STUDENT_ENROLLMENT ssm
    WHERE ssm.SYEAR='2010' 
    AND ssm.SCHOOL_ID='12' 
    AND ssm.GRADE_ID IN ('140','141','142','143','144','145')
    AND EXISTS(SELECT srcg.GRADE_TITLE from STUDENT_REPORT_CARD_GRADES srcg, STUDENT_ENROLLMENT ssm
    WHERE srcg.STUDENT_ID=ssm.STUDENT_ID 
    AND srcg.SYEAR='2010' 
    AND srcg.SCHOOL_ID='12' 
    AND srcg.MARKING_PERIOD_ID='434' 
    AND srcg.GRADE_TITLE IN ('1','2','F','D'));

но возвращает больше записей, так что, очевидно, я делаю что-то не так. Есть ли способ использовать EXISTS, который будет возвращать те же результаты, что и первый запрос, но который более эффективен?

Ответы [ 5 ]

0 голосов
/ 01 июня 2011

попробуйте это

    SELECT distinct ssm.STUDENT_ID
    FROM STUDENT_ENROLLMENT ssm, STUDENT_REPORT_CARD_GRADES srcg
    WHERE ssm.SYEAR='2010' 
    AND ssm.SCHOOL_ID='12' 
    AND ssm.GRADE_ID IN ('140','141','142','143','144','145')    
    AND srcg.STUDENT_ID=ssm.STUDENT_ID 
    AND srcg.SYEAR= ssm.SYEAR 
    AND srcg.SCHOOL_ID=ssm.SCHOOL_ID
    AND srcg.MARKING_PERIOD_ID='434' 
    AND srcg.GRADE_TITLE IN ('1','2','F','D')               
0 голосов
/ 31 мая 2011

По моему опыту, EXISTS - это не то, что вы должны использовать, если вы заинтересованы в эффективности.Попробуйте сделать следующее:

SELECT DISTINCT ssm.STUDENT_ID
FROM STUDENT_ENROLLMENT ssm
INNER JOIN STUDENT_REPORT_CARD_GRADES srcg
  ON (srcg.STUDENT_ID = ssm.STUDENT_ID)
WHERE ssm.SYEAR='2010' AND
      ssm.SCHOOL_ID = '12' AND
      ssm.GRADE_ID IN ('140','141','142','143','144','145') AND
      srcg.SYEAR='2010' AND
      srcg.SCHOOL_ID = '12' AND
      srcg.MARKING_PERIOD_ID = '434' AND
      srcg.GRADE_TITLE IN ('1','2','F','D')

Убедитесь, что у вас есть индексы для следующих полей или групп полей:

  • STUDENT_ENROLLMENT (STUDENT_ID)
  • STUDENT_ENROLLMENT (SYEAR,SCHOOL_ID, GRADE_ID)
  • STUDENT_REPORT_CARD_GRADES (STUDENT_ID)
  • STUDENT_REPORT_CARD_GRADES (SYEAR, SCHOOL_ID, MARKING_PERIOD_ID, GRADE_TITLE)
0 голосов
/ 31 мая 2011

Вы можете исключить объединение с student_enrollment внутри предложения Существует.

 SELECT ssm.STUDENT_ID, COUNT(*) AS POSTED_GRADES
   FROM STUDENT_ENROLLMENT ssm
  WHERE ssm.SYEAR = '2010' 
    AND ssm.SCHOOL_ID = '12' 
    AND ssm.GRADE_ID IN ('140','141','142','143','144','145')
    AND EXISTS(SELECT srcg.GRADE_TITLE 
                 from STUDENT_REPORT_CARD_GRADES srcg
                WHERE srcg.SYEAR = '2010' 
                  AND srcg.SCHOOL_ID = '12' 
                  AND srcg.MARKING_PERIOD_ID = '434' 
                  AND srcg.GRADE_TITLE IN ('1','2','F','D')
              );
GROUP BY ssm.STUDENT_ID

Если таблица STUDENT_REPORT_CARD_GRADES огромна, это может быть быстрее.

0 голосов
/ 31 мая 2011

У меня давняя неприязнь к «отличным», так как в прошлом у меня были скрытые ошибки.Я бы порекомендовал это:

select STUDENT_ID from 
(SELECT ssm.STUDENT_ID,COUNT(srcg.GRADE_TITLE) AS POSTED_GRADES
    FROM STUDENT_ENROLLMENT ssm, STUDENT_REPORT_CARD_GRADES srcg
    WHERE ssm.SYEAR='2010' 
    AND ssm.SCHOOL_ID='12' 
    AND ssm.GRADE_ID IN ('140','141','142','143','144','145')
    AND srcg.STUDENT_ID=ssm.STUDENT_ID 
    AND srcg.SYEAR='2010' 
    AND srcg.SCHOOL_ID='12' 
    AND srcg.MARKING_PERIOD_ID='434' 
    AND srcg.GRADE_TITLE IN ('1','2','F','D')               
    GROUP BY ssm.STUDENT_ID);
0 голосов
/ 31 мая 2011

Вы получаете больше записей, потому что вы не удаляете дубликаты, как в первом запросе, используя GROUP BY.Вставьте GROUP BY обратно или добавьте DISTINCT и посмотрите, как это работает.

...