【问题标题】:Oracle Query [need subquery?]Oracle 查询 [需要子查询?]
【发布时间】:2019-05-31 07:24:43
【问题描述】:

假设我有下表:

NUM  TYPE  STAT   ERR
123   10      6    62
123   10      6    62
123   10      6    62
123   17      4     0
321   10      6    62
321   10      6    62

我目前正在使用以下查询:

select MIN(NUM) as NUMBER
     , MIN(STAT) as STATUS
     , MIN(ERR) as ERROR
     , MIN(retry) as RETRY 
 from TABLE_TB 
where ERR=62 
group by NUM 
having count(ERR) > 1;

输出将是:

NUM  TYPE  STAT   ERR  RETRY
123   10      6    62      3
321   10      6    62      2

没关系,但我需要的是查询将只输出NUM WITH ERR=62,但也输出 ERR = 0,不包括 ERR=62 但没有 ERR=0 的那些。以第一个表为例,查询应该输出

NUM  TYPE  STAT   ERR  RETRY
123   10      6    62      3

这是因为 NUM 123 的 ERR=62(3 次)而且 ERR=0。因此,NUM 321 将被排除,因为即使 ERR=62,它也不具有 ERR=0。

希望是明确的:)

非常感谢。 卢卡斯

【问题讨论】:

    标签: oracle


    【解决方案1】:

    您可以使用子查询:

    SELECT num
         , MIN(type) AS type
         , MIN(stat) AS status
         , MIN(err) AS err
         , COUNT(*) AS retry
    FROM table_tb
    WHERE err != 0 AND
          num IN (SELECT num FROM tb WHERE err = 0)
    GROUP BY num;
    

    或者不使用子查询:

    SELECT num
         , MIN(CASE WHEN err != 0 THEN type END) AS type
         , MIN(CASE WHEN err != 0 THEN stat END) AS stat
         , MIN(CASE WHEN err != 0 THEN err END) AS err
         , COUNT(CASE WHEN err != 0 THEN 1 END) AS retry
    FROM table_tb
    GROUP BY num
    HAVING COUNT(DECODE(err, 0, 1)) > 0;
    

    输出:

    +-----+------+------+-----+-------+
    | NUM | TYPE | STAT | ERR | RETRY |
    +-----+------+------+-----+-------+
    | 123 |   10 |    6 |  62 |     3 |
    +-----+------+------+-----+-------+
    

    【讨论】:

    • 感谢您向我展示子查询示例(和 w/out)。我还是要试一试,但概念很清楚。
    【解决方案2】:

    您需要首先过滤err in (62, 0) 上的表,然后找出您有多少不同的错误类型(您需要 2 个,因为您有两个您感兴趣的错误代码)。

    获得该信息后,您可以过滤 err = 62 且不同计数 = 2 的行 - 例如:

    WITH results as (select num,
                            type,
                            stat,
                            err,
                            retry,
                            count(distinct err) over (partition by num) num_err_types
                     from   table_tb
                     where  err in (62, 0))
    select min(num) as nmbr,
           min(stat) as status,
           min(err) as ERROR,
           min(retry) as retry
    from   results
    where  err = 62
    and    num_err_types = 2;
    

    我使用 COUNT() 分析函数来查找不同的计数 - 这样,无论错误代码如何,都会将值添加到每一行,这使我们能够在最终查询中对其进行过滤。

    【讨论】:

    • 谢谢,这对我来说似乎有点复杂,但我会尽快尝试,希望我能理解。
    【解决方案3】:

    或者你也可以试试这个方法,简单又甜美……

    select MIN(NUM) as NUMBER
         , MIN(STAT) as STATUS
         , MAX(ERR) as ERROR
         , Count(*) as RETRY 
     from TestTable 
    where ERR IN (62 ,0)
    group by NUM 
    having count(ERR) > 1 AND MIN(ERR)=0;

    【讨论】:

    • 谢谢,是的,这很简单,而且看起来很完美!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多