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)。我还得试试,但概念很清楚。谢谢,这对我来说似乎有点复杂,但我很快就会试试,希望我能理解它。