Как показать правильные записи на основе столбца из выбора - PullRequest
0 голосов
/ 02 марта 2020
|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 = 2, то я должен получать записи только этих записей.

Если записи do not exists с attr_number = 2 , тогда я должен получить записи только там, где attr_number = 1.

Я пытался поиграть, чтобы решить мою проблему, и вы можете увидеть одобренные строки (где left join и soi.value IS NULL), но это не работает как я описал. Он не проверяет, существуют ли записи.

Да, мы должны использовать union для удаления дублирующихся строк.

Этот выбор используется в left outer join.

``

Ответы [ 3 ]

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

хорошо, теперь, когда вы отредактировали вопрос, который я понимаю ... вот как я бы это сделал, используя CTE

WITH att2 AS
(
  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
), att1 AS
(
  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
), base AS
(
  SELECT estpt_id, sero_id, osp_id,
         COALESCE(att1,att2) as source
  FROM (
    SELECT estpt_id, sero_id, osp_id, 1 AS att1, null as att2
    FROM att1
    GROUP BY estpt_id, sero_id, osp_id

    UNION 

    SELECT estpt_id, sero_id, osp_id, null AS att1, 2 AS att2
    FROM att1
    GROUP BY estpt_id, sero_id, osp_id
  )
)
SELECT 
   COALESCE(att1.value,att2.value) as value,
   base.osp_id,
   COALESCE(att1.stya_id,att2.stya_id) as stya_id,
   base.estpt_id, 
   COALESCE(att1.discount,att2.discount) as discount,
   eoax.discount, 
   base.sero_id 
FROM base
LEFT JOIN att1 ON base.estpt_id = att1.estpt_id and base.sero_id = att1.sero_id and base.osp_id and att1.osp_id and source = 1
LEFT JOIN att2 ON base.estpt_id = att2.estpt_id and base.sero_id = att2.sero_id and base.osp_id and att2.osp_id and source = 2
0 голосов
/ 04 марта 2020

Пожалуйста, посмотрите, можете ли вы использовать этот фильтр

with test  as
   (select 1 id, 'ABC attr 1' description, 1 attr_number from dual union all
select 2 id, 'DEF attr 1' description, 1 attr_number from dual union all
select 2 id, 'DEF attr 2' description, 2 attr_number from dual union all
select 2 id, 'DEF attr 3' description, 3 attr_number from dual union all
select 3 id, 'GHI attr 3' description, 3 attr_number from dual
   )
   select *
   from test t1
   where attr_number = 2
   or ( attr_number = 1 and not exists (select 1 from test t2 where t2.attr_number = 2 and t1.id = t2.id));
0 голосов
/ 02 марта 2020

Если записи существуют с attr_number = 2, то я должен получать записи только этих записей.
Если записей не существует с attr_number = 2, тогда я должен получать записи только там, где attr_number = 1.

Может ли это быть решено с помощью RANK для записей, извлеченных из левого внешнего соединения?

Простая демонстрация здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...