Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle查询[是否需要子查询?]_Oracle - Fatal编程技术网

Oracle查询[是否需要子查询?]

Oracle查询[是否需要子查询?],oracle,Oracle,假设我有下表: 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 ER

假设我有下表:

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
没关系,但我需要的是,查询将只输出ERR=62但ERR=0的
NUM
,不包括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

希望就在眼前:)

多谢各位。
Lucas

您可以使用子查询:

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;
或者不使用子查询执行以下操作:

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

您需要首先在(62,0)中的
err上筛选表,然后找到您有多少不同的错误类型(您需要2个,因为您有两个感兴趣的错误代码)

获得该信息后,您可以对err=62且distinct count=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()
分析函数来查找不同的计数-通过这种方式,无论错误代码是什么,都会将值添加到每一行,这是允许我们在最终查询中对其进行筛选的原因。

或者您可以尝试这种方式,简单而甜蜜。。。
选择最小值(NUM)作为数字
,MIN(STAT)作为状态
,MAX(ERR)as ERROR
,计数(*)作为重试
从测试表
其中ERR IN(62,0)
按数字分组

计数(误差)>1且最小值(误差)=0

谢谢,是的,它非常简单,而且似乎工作得非常完美!感谢您向我展示子查询示例(和w/out)。我还得试试,但概念很清楚。谢谢,这对我来说似乎有点复杂,但我很快就会试试,希望我能理解它。