我有以下数据 -
Status_table表
我想按如下方式过滤此数据 -
确定 - 如果任何行的值为“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',但我只想在所有状态为'是'时列出它
答案 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))