【问题标题】:SELECT CASE withsubquery returs more than one lineSELECT CASE withsubquery 返回多于一行
【发布时间】:2019-10-04 10:46:16
【问题描述】:

当我执行 partition_date = 2019-12-11 和 partition_date = 2019-07-06 的代码时,我收到一条错误消息,提示“子查询返回多于一行”。对于其他情况,它可以工作

select case when my_count <=1 AND status_  = 'END' then 0 
                    when my_count >1 AND status_ IN ('END', 'RUNNING', 'START', 'ERR') THEN 1              
                    ELSE -1
               end  AS W 
        INTO return_val
        from (select 
          (SELECT count(DISTINCT(status)) FROM my_table 
          WHERE my_table.HIVE = 'hive1' 
          AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
          AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
        ) my_count,
          (SELECT DISTINCT(status) AS status_ FROM my_table 
          my_table.HIVE = 'hive1' 
          AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
          AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
        )status_
          FROM dual 
            )x  ;
           RETURN(return_val);

my_table 就像

    STATUS |HIVE |PARTITION_DATE     |
    -------|-----|-------------------
    END    |hive1|2019-12-11 00:00:00|
    START  |hive1|2019-12-12 00:00:00|
    NA     |hive1|2019-12-13 00:00:00|
    END    |hive1|2019-09-12 00:00:00|
    END    |hive1|2019-09-13 00:00:00|
    END    |hive1|2019-09-14 00:00:00|
    ERR    |hive1|2019-08-06 00:00:00|
    ERR    |hive1|2019-07-06 00:00:00|
    START  |hive1|2019-07-07 00:00:00|
    RUNNING|hive1|2019-07-08 00:00:00|
    END    |hive1|2019-07-09 00:00:00|

【问题讨论】:

    标签: oracle plsqldeveloper


    【解决方案1】:

    你在声明中有几个状态:

    (SELECT DISTINCT(status) AS status_ FROM my_table 
              WHERE EL_F_BDP_PROC_REALTIME.HIVE = 'hive1' 
              AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
              AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
            )
    

    并返回多行。

    对于正确执行,您需要返回一个值示例:

    max((SELECT DISTINCT(status) AS status_ FROM my_table 
                  WHERE EL_F_BDP_PROC_REALTIME.HIVE = 'hive1' 
                  AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
                  AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
                ))
    

    它在执行吗,但是,或许,逻辑是错误的

    试试看:

    with tbl as (
    select 'START' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') dt from dual 
    union all
    select 'NA' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') from dual 
    union all
    select 'END' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') from dual)
    select dt, str, listagg(status, ' ') WITHIN GROUP (ORDER BY str) 
    from tbl
    GROUP BY dt, str
    

    【讨论】:

    • 我认为您可能正在使用 listagg 在一行中返回所有状态
    【解决方案2】:

    为什么不使用 group by,

    当 my_count 1 AND status_ IN ('END', 'RUNNING', 'START', 'ERR') THEN 1
    否则 -1 结束 AS W INTO return_val from (select DISTINCT count(status) as my_count,status as status_ FROM my_table WHERE EL_F_BDP_PROC_REALTIME.HIVE = 'hive1' AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD')) AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD')) 按状态分组)res ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多