Запрос на ОБЪЕДИНЕНИЕ и ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ по наследству — Добавление таблицы братьев и сестер

#mysql #sql

Вопрос:

Приведенный ниже запрос создает иерархическую связь с таблицами и записями:

 program -> program_outcome_group -> program_outcome -> unit -> leaning_event
 

На основе следующих структур таблиц:

 Table program:
         ------------ ---------------- 
        | program_pk |  program_name  |         
         ------------ ---------------- 
        
Table program_outcome_group: 
         -------------------------- ------------------------ ------------ 
        | program_outcome_group_pk |  program_outcome_group | program_fk |            
         -------------------------- ------------------------ ------------ 
        
Table program_outcome:         
         -------------------- ----------------- -------------------------- 
        | program_outcome_pk | program_outcome | program_outcome_group_fk |          
         -------------------- ----------------- -------------------------- 

Table unit:         
         --------- ----------- 
        | unit_pk | unit_name |          
         --------- ----------- 

Table program_outcome_unit_lookup:     
         -------------------------------- --------------------- --------- 
        | program_outcome_unit_lookup_pk | program_outcome_fk  | unit_fk |            
         -------------------------------- --------------------- --------- 
    
Table learning_event:     
         ------------------- --------------------- --------- 
        | learning_event_pk | learning_event_name | unit_fk |            
         ------------------- --------------------- ---------        

Table learning_event_program_outcome_lookup:     
         ------------------------------------------ ------------------- -------------------- 
        | learning_event_program_outcome_lookup_pk | learning_event_fk | program_outcome_fk |            
         ------------------------------------------ ------------------- -------------------- 
 

Приведенный ниже запрос подходит для этого.

Теперь я хочу добавить таблицу assessment , которая была бы родным братом к таблице learning_event :

 program -> program_outcome_group -> program_outcome -> unit -> leaning_event
                                                            -> assessment
 

Наряду с assessment таблицей существует еще одна таблица поиска:

 Table assessment:     
         --------------- ------------ --------- 
        | assessment_pk | assessment | unit_fk |            
         --------------- ------------ ---------        

Table assessment_program_outcome_lookup:     
         -------------------------------------- --------------- -------------------- 
        | assessment_program_outcome_lookup_pk | assessment_fk | program_outcome_fk |            
         -------------------------------------- --------------- -------------------- 
 

Как следует изменить приведенный ниже запрос, чтобы добавить новую таблицу братьев и сестер и таблицу поиска?

 SELECT CONCAT('program:', p.program_pk) AS global_id,
           p.program_name AS name,
           NULL AS parent_global_id
    FROM program p
    UNION ALL
    SELECT CONCAT('program_outcome_group:', pog.program_outcome_group_pk) AS global_id,
           pog.program_outcome_group AS name,
           CONCAT('program:', pog.program_fk) AS parent_global_id
    FROM program_outcome_group pog
    UNION ALL
    SELECT 
           CONCAT('program_outcome_group:', po.program_outcome_group_fk, ',program_outcome:', po.program_outcome) AS global_id,
           po.program_outcome AS name,
           CONCAT('program_outcome_group:', po.program_outcome_group_fk) AS parent_global_id
    FROM program_outcome po
    UNION ALL
    SELECT 
           CONCAT('program_outcome_group:', pro.program_outcome_group_fk, ',program_outcome:', pro.program_outcome, ',unit:', u.unit_full_name) AS global_id,
           u.unit_full_name AS name,
           CONCAT('program_outcome_group:', pro.program_outcome_group_fk, ',program_outcome:', pro.program_outcome) AS parent_global_id
    FROM unit u
    INNER JOIN program_outcome_unit_lookup uup ON u.unit_pk = uup.unit_fk
    INNER JOIN program_outcome pro ON pro.program_outcome_pk = uup.program_outcome_fk
    INNER JOIN program_outcome_group pog2 ON pro.program_outcome_group_fk = pog2.program_outcome_group_pk
    UNION ALL
    SELECT 
           CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_full_name, ',learning_event:', le.learning_event_name) AS global_id,
           le.learning_event_name AS name,
           CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_full_name) AS parent_global_id
    FROM learning_event le
    INNER JOIN unit u2 ON le.unit_fk = u2.unit_pk
    INNER JOIN program_outcome_unit_lookup uup ON u2.unit_pk = uup.unit_fk
    INNER JOIN program_outcome pro2 ON pro2.program_outcome_pk = uup.program_outcome_fk
    INNER JOIN program_outcome_group pog2 ON pro2.program_outcome_group_fk = pog2.program_outcome_group_pk
    JOIN learning_event_program_outcome_lookup lepol 
      ON lepol.learning_event_fk = le.learning_event_pk 
     AND lepol.program_outcome_fk = pro2.program_outcome_pk
 

См. скрипка

Комментарии:

1. Каковы роли этих новых таблиц? Будет ли он использоваться для фильтрации определенного набора результатов или он просто вернет дополнительную информацию для конечного результата?

2. Просто заметил, что в вопросе у меня был старый запрос. Теперь обновил это. Две новые таблицы по сути будут такими же функциональными, как две таблицы для событий обучения (таблица learning_event и связанная с ней таблица поиска, learning_event_программ_outcome_lookup). Новые таблицы оценки будут предоставлять братьям и сестрам learning_event и оценку. Таким образом, последний ВЫБОР может быть реплицирован, и learning_event будет заменен оценкой, а затем таблица поиска для оценки будет добавлена таким же образом, как и другая таблица поиска. Надеюсь, в этом есть смысл…

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

Ответ №1:

Вам даже не нужно понимать предыдущий sql,просто измените имя в порядке

  union all
    SELECT 
           CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_name, ',assessment:', t1.assessment) AS global_id,
           t1.assessment AS name,
           CONCAT('program_outcome_group:', pro2.program_outcome_group_fk, ',program_outcome:', pro2.program_outcome, ',unit:', u2.unit_name) AS parent_global_id
    FROM assessment t1
    INNER JOIN unit u2 ON t1.unit_fk = u2.unit_pk
    INNER JOIN program_outcome_unit_lookup uup ON u2.unit_pk = uup.unit_fk
    INNER JOIN program_outcome pro2 ON pro2.program_outcome_pk = uup.program_outcome_fk
    INNER JOIN program_outcome_group pog2 ON pro2.program_outcome_group_fk = pog2.program_outcome_group_pk
    JOIN assessment_program_outcome_lookup t5 
      ON t5.assessment_fk = t1.assessment_pk 
     AND t5.program_outcome_fk = pro2.program_outcome_pk