【问题标题】:get only row that meet condition if such row exist and if not get the row that meet another condition如果存在此类行,则仅获取满足条件的行,如果不存在则获取满足另一个条件的行
【发布时间】:2018-12-25 10:43:47
【问题描述】:

这听起来像是一个简单的问题,但我就是找不到正确的方法。 给定简化表

with t as  (
select   ordernumber, orderdate,  case when ordertype in (5,21) then 1 else 0 end is_restore , ordertype, row_number() over(order by orderdate) rn from
( 
select to_date('29.08.08','DD.MM.YY') orderdate,'313' ordernumber, 1  as ordertype  from dual union all
select to_date('13.03.15','DD.MM.YY') orderdate, '90/4/2' ordernumber, 5  as ordertype from dual
)
)
select * from t -- where clause  should be here 

对于每一行,is_restore 保证为 1 或 0。 如果表中有一行 is_restore=1 则选择该行的订单号、订单日期,仅此而已。 如果表中没有 is_restore=1 的行,则选择 rn=1 的行的 ordernumber,orderdate(保证表中存在 rn=1 的行) 鉴于上述要求,我需要在 where 子句中添加什么才能获得以下要求?

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    你可以使用ROW_NUMBER:

    CREATE TABLE t
    AS
    select ordernumber, orderdate,
        case when ordertype in (5,21) then 1 else 0 end is_restore, ordertype,
        row_number() over(order by orderdate) rn
      from ( 
         select to_date('29.08.08','DD.MM.YY') orderdate,'313' ordernumber,
               1  as ordertype 
         from dual union all
         select to_date('13.03.15','DD.MM.YY') orderdate, '90/4/2' ordernumber,
                5  as ordertype
         from dual);
    
    -------------------
    
    with cte as (
      select t.*,
        ROW_NUMBER() OVER(/*PARTITION BY ...*/ ORDER BY is_restore DESC, rn) AS rnk
      from t
    )
    SELECT *
    FROM cte
    WHERE rnk = 1;
    

    db<>fiddle demo

    【讨论】:

      【解决方案2】:

      这里是 sql,它不使用窗口函数,也许它对那些数据库不支持 OVER ( ... ) 或者当有索引字段时,查询是基于的。

      SELECT
      * 
      FROM t
      WHERE t.is_restore = 1 
      OR (
       NOT EXISTS (SELECT 1 FROM t WHERE t.is_restore = 1)
       AND t.rn = 1
      )
      

      【讨论】:

      • 解释,发布的代码的作用以及它如何解决问题中的问题,很少不能改善答案。
      • 如果您不明白答案,请提出问题。我应该在这里解释什么?
      • 这是一个一般性建议,因为您的答案在“低质量审核队列”中结束,因为它只是包含代码。并且通常不需要添加几句话来解释发布的代码的作用以及它如何解决问题中的问题。当您发布您的答案时,这里已经有一个答案。那么为什么不告诉你为什么你认为你的方法更好呢?或者您可以说出您的答案添加到现有答案中的内容。这些只是一些想法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 2021-06-06
      • 1970-01-01
      • 2015-10-13
      • 2018-12-21
      • 2017-01-13
      相关资源
      最近更新 更多