SELECT * FROM (
SELECT soi.value, srv.osp_id, soi.stya_id, eoax.estpt_id, eoax.discount, int_sero.id AS sero_id, 2 as attr_number
FROM srv_obj_attr_intermediate soi
JOIN estpt_objt_attr_xref eoax ON eoax.interest_rate = 1
JOIN attribute_types attl ON attl.id = eoax.attr_id
JOIN object_attribute_type_links oatl ON oatl.attr_id = attl.id
JOIN service_type_attributes sta ON sta.objt_attr_id = oatl.id
JOIN service_objects int_sero ON int_sero.id = soi.sero_id
JOIN services srv ON srv.id = int_sero.srv_id
JOIN order_event_types oet ON oet.code = 'CALC_INTERMEDIATE_ESTP'
WHERE eoax.ordet_id = oet.id AND eoax.objt_attr_id = sta.objt_attr_id
AND soi.stya_id = sta.id AND soi.value = 1
UNION
SELECT soa.value, srv.osp_id, soa.stya_id, eoax.estpt_id, eoax.discount, int_sero.id AS sero_id, 1 as attr_number
FROM srv_obj_attributes soa
JOIN estpt_objt_attr_xref eoax ON eoax.interest_rate = 1
JOIN attribute_types attl ON attl.id = eoax.attr_id
JOIN object_attribute_type_links oatl ON oatl.attr_id = attl.id
JOIN service_type_attributes sta ON sta.objt_attr_id = oatl.id
--LEFT JOIN srv_obj_attr_intermediate soi ON soi.stya_id = sta.id
--AND soi.value = 1
JOIN service_objects int_sero ON int_sero.id = soa.sero_id
JOIN services srv ON srv.id = int_sero.srv_id
JOIN order_event_types oet ON oet.code = 'CALC_INITIAL_ESTP'
WHERE eoax.ordet_id = oet.id AND eoax.objt_attr_id = sta.objt_attr_id
AND soa.stya_id = sta.id AND soa.value = 1 --AND soi.value IS NULL
)
) intrate ON intrate.estpt_id = estpt.id
AND intrate.sero_id = esero.sero_id
AND intrate.osp_id = srv.osp_id --This parameters are served. For this example we replaced srv.osp_id to 619771
Этот выбор возвращает мне эти записи
|VALUE |OSP_ID |STYA_ID |ESTPT_ID |DISCOUNT |SERO_ID |ATTR_NUMBER |
|---------------------------------------|-------------|-------------|---------------------------------------|---------------------------------------|-------------|---------------------------------------|
|1 |619771 |34659 |1812 |30 |3933326 |1 |
|1 |619771 |34659 |1812 |30 |3933327 |1 |
|1 |619771 |34659 |1916 |30 |3933326 |1 |
|1 |619771 |34659 |1916 |30 |3933327 |1 |
|1 |619771 |34659 |1987 |30 |3933326 |1 |
|1 |619771 |34659 |1987 |30 |3933327 |1 |
|1 |619771 |34659 |2027 |30 |3933326 |1 |
|1 |619771 |34659 |2027 |30 |3933327 |1 |
|1 |619771 |34659 |2028 |30 |3933326 |1 |
|1 |619771 |34659 |2028 |30 |3933327 |1 |
|1 |619771 |34659 |2029 |30 |3933326 |1 |
|1 |619771 |34659 |2029 |30 |3933327 |1 |
|1 |619771 |34659 |1812 |40 |3933327 |2 |
|1 |619771 |34659 |1916 |40 |3933327 |2 |
|1 |619771 |34659 |1987 |40 |3933327 |2 |
|1 |619771 |34659 |2027 |40 |3933327 |2 |
|1 |619771 |34659 |2028 |40 |3933327 |2 |
|1 |619771 |34659 |2029 |40 |3933327 |2 |
Мне нужно добавить проверку на каждый выбор имеет собственный attr_number
. Исходя из этого столбца, мне нужно возвращать записи.
Если записи exists
с attr_number = 1
, то я должен получать записи только этих записей.
Если записи do not exists
с attr_number = 1
, тогда я должен получить записи только там, где attr_number = 2
.
Я пытался поиграть, чтобы решить мою проблему, и вы можете увидеть одобренные строки (где left join
и soi.value IS NULL
), но это не работает как я описал. Он не проверяет, существуют ли записи.
Да, мы должны использовать union
для удаления дублирующихся строк.
Этот выбор используется в left outer join
.