Получить правильные записи, опираясь на «поддельные» столбец - PullRequest
0 голосов
/ 03 марта 2020
   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.

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы можете использовать analytical function следующим образом:

select *
from (
    select 
        t.*,
        Min(attr_number) over(
            partition by value, stya_id, espt_id) as min_a
    from (
        -- your `union` query
    ) t
) t
where attr_number = min_a

Ура !!

0 голосов
/ 03 марта 2020

Вы можете использовать rank() для фильтрации набора результатов:

select *
from (
    select 
        t.*,
        rank() over(
            partition by osp_id, stya_id, espt_id, sero_id 
            order by attr_number desc
        ) rn
    from (
        -- your big `unioon` query
    ) t
) t
where rn = 1

Я сделал предположения о partition, так как вы точно не сказали, какие столбцы определяют группу.


Вы отметили свой вопрос Oracle 10г. Однако обратите внимание, что если бы вы использовали Oracle 12 c, это было бы проще сделать с помощью предложения ограничения строки:

    select t.*
    from (
        -- your big `unioon` query
    ) t
    order by rank() over(
            partition by osp_id, stya_id, espt_id, sero_id 
            order by attr_number desc
        )
    fetch first 1 rows with ties
...