依赖"fake"列获取正确记录

Get correct records relying on "fake" column

   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

这个selectreturn我这个记录

|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                                      |

我需要对每个 select 拥有自己的 attr_number 添加检查。基于此专栏,我需要 return 条记录。

如果记录 existsattr_number = 1,那么我应该只获取那些记录。

如果记录 do not existsattr_number = 1,那么我应该只在 attr_number = 2.

处获取记录

我试图尝试解决我的问题,您可以看到推荐行(left joinsoi.value IS NULL 在哪里),但它没有像我描述的那样工作。他没有检查记录是否存在。

是的,我们应该使用 union 删除重复行。

此select用于left outer join

您可以使用 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 10g。但是请注意,如果您要使用 Oracle 12c,使用行限制子句会更简单:

    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

您可以按如下方式使用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

干杯!!