Слишком много результатов из запроса - PullRequest
1 голос
/ 25 апреля 2011

Я пытаюсь понять следующий запрос,

SELECT s.LAST_NAME||', '||s.FIRST_NAME||' '||COALESCE(s.MIDDLE_NAME,' ') AS FULL_NAME,
s.LAST_NAME,
s.FIRST_NAME,
s.MIDDLE_NAME,
s.STUDENT_ID,
ssm.SCHOOL_ID,
ssm.SCHOOL_ID AS LIST_SCHOOL_ID,
ssm.GRADE_ID ,
sg1.BENCHMARK_ID,
sg1.GRADE_TITLE,
sg1.COMMENT AS COMMENT_TITLE,
ssm.STUDENT_ID,
sg1.MARKING_PERIOD_ID,
sg1.LONGER_COURSE_COMMENTS,
sp.SORT_ORDER,
sched.COURSE_PERIOD_ID 
FROM STUDENTS s,
STUDENT_ENROLLMENT ssm ,
SCHEDULE sched 
LEFT OUTER JOIN STUDENT_REPORT_CARD_BENCHMARKS sg1 ON (
sg1.STUDENT_ID=sched.STUDENT_ID 
AND sched.COURSE_PERIOD_ID=sg1.COURSE_PERIOD_ID 
AND sg1.MARKING_PERIOD_ID IN ('0','442','445','450') 
AND sg1.SYEAR=sched.SYEAR) 
LEFT OUTER JOIN COURSE_PERIODS rc_cp ON (
rc_cp.COURSE_PERIOD_ID=sg1.COURSE_PERIOD_ID 
AND rc_cp.DOES_GRADES='Y') 
LEFT OUTER JOIN SCHOOL_PERIODS sp ON (sp.PERIOD_ID=rc_cp.PERIOD_ID) 
WHERE ssm.STUDENT_ID=s.STUDENT_ID  
AND ssm.SCHOOL_ID='1'  
AND ssm.SYEAR='2010' 
AND ('22-APR-11' BETWEEN ssm.START_DATE AND ssm.END_DATE OR (ssm.END_DATE IS NULL))  
AND (LOWER(s.LAST_NAME) LIKE 'la''porsha%' OR LOWER(s.FIRST_NAME) LIKE 'la''porsha%' ) 
AND sched.STUDENT_ID=ssm.STUDENT_ID AND sched.MARKING_PERIOD_ID IN ('0','444','446','447','445','448','450','443','449') 
AND ('22-APR-11' BETWEEN sched.START_DATE AND sched.END_DATE OR (sched.END_DATE IS NULL AND '22-APR-11'>=sched.START_DATE))     
ORDER BY s.LAST_NAME,s.FIRST_NAME

и измените его так, чтобы он возвращал правильные результаты - чтобы возвращался только один отдельный человек. При поиске какого-либо конкретного человека возвращаются несколько результатов, поскольку из schedule.course_period_id возвращаются уникальные значения. Так как в поле course_period_id есть несколько левых внешних объединений, но в разных таблицах, я не понимаю, как изменить запрос.

Ответы [ 3 ]

3 голосов
/ 25 апреля 2011

Моя попытка помочь людям ответить, отформатировав ваш запрос и избавившись от смешанного синтаксиса.Не совсем ответ, но слишком длинный для комментария:

    SELECT s.LAST_NAME || ', ' || s.FIRST_NAME || ' ' || COALESCE(s.MIDDLE_NAME,' ') 
      AS FULL_NAME,
    s.LAST_NAME, s.FIRST_NAME, s.MIDDLE_NAME, s.STUDENT_ID, 
    ssm.SCHOOL_ID, ssm.SCHOOL_ID AS LIST_SCHOOL_ID, ssm.GRADE_ID ,
    sg1.BENCHMARK_ID, sg1.GRADE_TITLE, sg1.COMMENT AS COMMENT_TITLE,
    ssm.STUDENT_ID, sg1.MARKING_PERIOD_ID, sg1.LONGER_COURSE_COMMENTS,
    sp.SORT_ORDER, sched.COURSE_PERIOD_ID 
    FROM STUDENTS s
      INNER JOIN STUDENT_ENROLLMENT ssm
        ON ssm.STUDENT_ID=s.STUDENT_ID   -- moved from WHERE to here
      INNER JOIN SCHEDULE sched 
        ON sched.STUDENT_ID=ssm.STUDENT_ID -- moved from WHERE to here
      LEFT OUTER JOIN STUDENT_REPORT_CARD_BENCHMARKS sg1 
        ON (    sg1.STUDENT_ID=sched.STUDENT_ID 
            AND sched.COURSE_PERIOD_ID=sg1.COURSE_PERIOD_ID 
            AND sg1.MARKING_PERIOD_ID IN ('0','442','445','450') 
            AND sg1.SYEAR=sched.SYEAR) 
      LEFT OUTER JOIN COURSE_PERIODS rc_cp 
        ON (    rc_cp.COURSE_PERIOD_ID=sg1.COURSE_PERIOD_ID 
            AND rc_cp.DOES_GRADES='Y') 
      LEFT OUTER JOIN SCHOOL_PERIODS sp 
        ON (sp.PERIOD_ID=rc_cp.PERIOD_ID) 
    WHERE ssm.SCHOOL_ID='1'  
      AND ssm.SYEAR='2010' 
      AND ('22-APR-11' BETWEEN ssm.START_DATE AND ssm.END_DATE 
           OR (ssm.END_DATE IS NULL))  
      AND (  LOWER(s.LAST_NAME) LIKE 'la''porsha%' 
           OR LOWER(s.FIRST_NAME) LIKE 'la''porsha%' ) 
    AND sched.MARKING_PERIOD_ID 
         IN  ('0','444','446','447','445','448','450','443','449') 
    AND (   '22-APR-11' BETWEEN sched.START_DATE AND sched.END_DATE 
         OR (     sched.END_DATE IS NULL
             AND '22-APR-11' >= sched.START_DATE))     
ORDER BY s.LAST_NAME, s.FIRST_NAME

Надеюсь, это поможет.

2 голосов
/ 25 апреля 2011

Ну, конечно, у вас есть несколько записей, если дочерние таблицы объединены, чтобы иметь несколько записей для одного человека.Это ожидаемое и правильное поведение.

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

Если вам необходимо использовать group by, а затем поместить агрегат (например, min или max) в поля, которые вызывают несколько записей.Однако вам все равно нужно знать, хотите ли вы только записи за первый период или записи за последний период, или как вы решите из шести записей для человека, какую вы хотите увидеть?

0 голосов
/ 25 апреля 2011

Поиск предложение group by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...