Союз? Пересекаются? Или обратное пересечение?

Я работаю над оператором select, который должен возвращать класс для каждого учебного дня. Осталось 4 учебных дня, прежде чем цикл начнется снова. (например, понедельник = день 1, вторник = день 2... четверг = день 4, пятница = день 1 и т. д.)

У некоторых учеников может быть 1 выходной в определенные дни, и в этом случае мы должны отображать пустое место в этой комбинации день/период.

На данный момент оператор select возвращает только те дни, которые имеют значение.

Пример:

            Day 1    Day 2    Day 3    Day 4
Period 1    class    class    off      class
Period 2    class    class    class    off
Period 3    off      class    class    class
Period 4    class    off      class    class

Я пытаюсь добиться того, чтобы оператор select возвращал пустую строку (с нулевыми значениями) вместо периода, который отключен в определенный день. Я попытался добавить Unions с днем ​​​​в качестве единственного значения.

Это не работает, так как я получаю свои первые 3 строки, а затем 4 других, но на самом деле мне нужны первые 3 строки (например, с днями 1,3,4) и последняя объединенная строка (например, день 2) в этом случае я могу потом сделать заказ в тот же день.

Как я могу это сделать? Должен ли я использовать пересечение? ..или противоположность пересечения? Также это для базы данных Oracle.

Выберите оператор:

select spct.course_code||'-'||spct.course_section as course,t.school_cycle_day as jour,p.legal_first_name,p.legal_surname,sc.room_no
from   student_program_class_tracks@trl spct,class_meetings@trl cm,school_classes@trl sc,persons@trl p,timeslots@trl t,school_timeline_periods@trl tsp
where  spct.school_code=cm.school_code
and    spct.school_code=sc.school_code
and    spct.school_code=t.school_code
and    spct.school_code=tsp.school_code
and    spct.school_year=cm.school_year
and    spct.school_year=sc.school_year
and    spct.school_year=t.school_year
and    spct.school_year=tsp.school_year
and    t.school_year_track=tsp.school_year_track
and    t.school_timeline_code=tsp.school_timeline_code
and    t.school_period=tsp.school_period
and    spct.class_code=cm.class_code
and    spct.class_code=sc.class_code
and    sc.reporting_teacher=p.person_id
and    cm.block=t.block
and    spct.school_code='73'
and    spct.school_year='20122013'
and    spct.person_id='000170629'
and    cm.semester='2'
and    cm.term='1'
and    t.school_period='1'
and    ((spct.start_date <= sysdate and spct.end_date >= sysdate) or spct.demit_indicator='0')
--order by t.school_cycle_day

UNION

SELECT '','1','','','' from DUAL

UNION

SELECT '','2','','','' from DUAL

UNION

SELECT '','3','','','' from DUAL

UNION

SELECT '','4','','','' from DUAL;

Вывод:

Course         Jour    Legal_first_name   Legqal_surname     Room_no
PPL4OO-03      2       François           Belle-Isle     1-139
SBI4UU-02      4       Louise             Bérubé             1-155
TFC4EE-02      3       Gino               Proulx             1-127
           1            

Спасибо за любую помощь, которую вы можете предоставить!


person MPaul    schedule 05.11.2013    source источник


Ответы (1)


Если вы говорите, что вам нужно 4 строки на ученика, то это должно сделать что-то вроде следующего.

SELECT
    B.course
    A.school_cycle_day,
    B.legal_first_name,
    B.legal_surname,
    B.room_no
FROM
    (
        SELECT '1' AS school_cycle_day
        FROM DUAL

        UNION ALL

        SELECT '2'
        FROM DUAL

        UNION ALL

        SELECT '3'
        FROM DUAL

        UNION ALL

        SELECT '4'
        FROM DUAL
    ) A
    LEFT JOIN
   (
      select
           spct.course_code||'-'||spct.course_section as course,
           t.school_cycle_day as jour,
           p.legal_first_name,
           p.legal_surname,
           sc.room_no
      from
           student_program_class_tracks@trl spct,
           class_meetings@trl cm,
           school_classes@trl sc,
           persons@trl p,
           timeslots@trl t,
           school_timeline_periods@trl tsp
      where
           spct.school_code=cm.school_code and
           spct.school_code=sc.school_code and
           spct.school_code=t.school_code and
           spct.school_code=tsp.school_code and
           spct.school_year=cm.school_year and
           spct.school_year=sc.school_year and
           spct.school_year=t.school_year and
           spct.school_year=tsp.school_year and
           t.school_year_track=tsp.school_year_track and
           t.school_timeline_code=tsp.school_timeline_code and
           t.school_period=tsp.school_period and
           spct.class_code=cm.class_code and
           spct.class_code=sc.class_code and
           sc.reporting_teacher=p.person_id and
           cm.block=t.block and
           spct.school_code='73' and
           spct.school_year='20122013' and
           spct.person_id='000170629' and
           cm.semester='2' and
           cm.term='1' and
           t.school_period='1' and
           ((spct.start_date <= sysdate and spct.end_date >= sysdate) or  spct.demit_indicator='0')
) B ON A.school_cycle_day = B.school_cycle_day
person George    schedule 05.11.2013