仅在所有行具有相同值时才获取数据

时间:2013-08-30 09:08:17

标签: oracle

我有以下数据 -

Status_table表

enter image description here

我想按如下方式过滤此数据 -

确定 - 如果任何行的值为“OK”,则应返回num(11)。

Select distinct Num from Status_table where status = 'ok') -- Working fine

- 如果任何行的值为“NO”,则应返回num(11)。

Select distinct Num from Status_table where status = 'No') -- Working fine

- 只有当所有值均为“是”时,才会返回“11” 我写下面的查询

Select distinct Num from Status_table where status = 'yes')

这不起作用,因为它会列出'11',但我只想在所有状态为'是'时列出它

4 个答案:

答案 0 :(得分:3)

您当前的查询对于大型数据集来说可能效率低下,并且无法很好地扩展。

最好:

Select Num
from   Status_table
where  status = 'ok' and
       rownum = 1;

Select Num
from   Status_table
where  status = 'No' and
       rownum = 1;

当找到所需的值时,这些将停止扫描表。

对于“是”查询:​​

Select Num
from   Status_table
where  status = 'Yes' and
       rownum = 1     and 
       not exists (
         select null
         from   Status_table
         where  status != 'Yes')

这将扫描表格,直到找到一行“是”,如果是,那么它将检查是否存在任何其他值。

答案 1 :(得分:1)

如果您在(Num, Status)上有索引,这将非常有效:

SELECT Num 
FROM Status_table 
GROUP BY Num
HAVING MIN(status) = 'yes'
   AND MAX(status) = 'yes' ;

没有子查询,也没有计数。只需要进行索引扫描。

答案 2 :(得分:0)

WITH t(id, num, status) AS
     ( SELECT 1, 11, 'yes' FROM dual
     UNION
     SELECT 2, 11, 'yes' FROM dual
     UNION
     SELECT 3, 11, 'yes' FROM dual
     UNION
     SELECT 4, 11, 'yes' FROM dual
     UNION
     SELECT 5, 11, 'yes' FROM dual
     )
SELECT DISTINCT num
FROM t
WHERE NOT EXISTS (
     (SELECT status, COUNT(*) FROM t GROUP BY status HAVING status <> 'yes'
     ));

答案 3 :(得分:0)

如果查询应返回num中的值,如果状态为Yes,则尝试尝试

select distinct Num from status_table
where 
upper(status)=upper(decode((select count(*) "Count" from status_table where upper(status)!=upper('yes')),0,'Yes',NULL))