1

我有以下数据-

status_table 表

在此处输入图像描述

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

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

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

- 如果任何行的值为“否”,则应返回 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

4 回答 4

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')

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

于 2013-08-30T11:04:38.207 回答
1

如果你有一个索引(Num, Status),这将非常有效:

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

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

于 2013-08-30T09:41:50.180 回答
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'
     ));
于 2013-08-30T09:16:31.387 回答
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))
于 2013-08-30T09:22:33.890 回答