Объединение или лучший способ соединения SQL-запросов с результирующими наборами с аналогичными таблицами

#sql

Вопрос:

У меня есть запрос, в котором я соединяю два набора данных с помощью объединения, с большим количеством похожих соединений таблиц. Единственное различие между двумя запросами-это две таблицы отношений ection_view_reltns amp; element_section_reltns , и graph_view_reltns amp; graph_element_reltns они начинают свои объединения с cv.orig_charting_view_id.

Я был бы признателен за некоторую помощь, и мне было интересно, есть ли лучший способ написать это для повышения производительности запросов?

 select cv.orig_charting_view_id, cvt.view_name, cvt.view_label, cv.version, ce.orig_charting_element_id, ce.version, cet.element_name, cet.element_label, ce.element_type, ce.element_type_meaning, ce.beg_effective_dt_tm
from charting_views cv
inner join charting_view_translations cvt ON cvt.charting_view_id = cv.charting_view_id
inner join section_view_reltns scr ON scr.orig_charting_view_id = cv.orig_charting_view_id and scr.charting_view_version = cv.version
inner join element_section_reltns esr ON esr.orig_charting_section_id = scr.orig_charting_section_id and esr.charting_section_version = scr.charting_section_version
inner join charting_elements ce ON ce.orig_charting_element_id = esr.orig_charting_element_id and ce.version = esr.charting_element_version
inner join charting_element_translations cet ON cet.charting_element_id = ce.charting_element_id
where cv.end_effective_dt_tm > NOW() and cv.status = 2
and cet.locale='en-US'
and ce.end_effective_dt_tm > NOW() and ce.status = 2
union
select cv.orig_charting_view_id, cvt.view_name, cvt.view_label, cv.version, ce.orig_charting_element_id, ce.version, cet.element_name, cet.element_label, ce.element_type, ce.element_type_meaning, ce.beg_effective_dt_tm
from charting_views cv
inner join charting_view_translations cvt ON cvt.charting_view_id = cv.charting_view_id
inner join graph_view_reltns gvr ON gvr.orig_charting_view_id = cv.orig_charting_view_id
inner join graph_element_reltns ger ON ger.graph_id = gvr.orig_graph_id and ger.graph_version = gvr.graph_version
inner join charting_elements ce ON ce.orig_charting_element_id = ger.element_id and ce.version = ger.charting_element_version
inner join charting_element_translations cet ON cet.charting_element_id = ce.charting_element_id
where cv.end_effective_dt_tm > NOW() and cv.status = 2
and ce.end_effective_dt_tm > NOW() and ce.status = 2
and cet.locale='en-US'
;
 

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

1. Часто вам следует выбирать union all , а не union повышать производительность запроса , и при необходимости заключать в запрос с a group by .

2. Вероятно, вы могли бы объединить это в один запрос, используя внешние объединения для различий и некоторую дополнительную фильтрацию.