用于筛选唯一状态记录的SQL查询
我需要一个SQL Server和Oracle兼容的查询来获得以下结果 表:用于筛选唯一状态记录的SQL查询,sql,sql-server,oracle,Sql,Sql Server,Oracle,我需要一个SQL Server和Oracle兼容的查询来获得以下结果 表: PRIMARY IDN SECONDARY_IDN STATUS 1 47 Pending 2 47 Completed 3 47 Error 4 57 Pending 5 59
PRIMARY IDN SECONDARY_IDN STATUS
1 47 Pending
2 47 Completed
3 47 Error
4 57 Pending
5 59 Completed
6 60 Pending
7 60 Completed
我的输入可能是挂起的、已完成的或错误的
我需要列出所有的二级IDN,只有一个状态,这就是输入状态
例如,我的输入是挂起的:它应该只显示57。其他可能有挂起,但也有已完成和错误记录
你能帮帮我吗
SELECT SECONDARY_IDN
FROM tableName
GROUP BY SECONDARY_IDN
HAVING SUM(CASE WHEN Status = 'Pending' THEN 1 ELSE 0 END) = COUNT(*)
您需要只有一个状态的组。为此,您希望使用聚合:
select secondary_idn
from t
group by secondary_idn
having max(status) = min(status) and -- all the statuses are the same
max(status) = 'Pending' -- and the status is Pending
外部查询没有GROUPBY,因此所有列都可以使用。可怕的select*就是为了说明这一事实
exists只需检测一条不需要的记录即可生成true,聚合了min、max、count的解决方案可能必须扫描并聚合整个组以确定记录的可取性。
SQLFIddle非常有趣,顺便问一下,您使用的是什么rdbms?工作时使用MSSQL和Oracle,在家中使用MYSQL,但很少使用,因为我是一名web开发人员:-maxstatus是什么意思,它是一个字符串,不是吗?@Nishant。是的,它是一根绳子。min和max处理字符串、字符和日期/时间数据时间。这是需要在代码中添加注释的简洁解决方案之一:这一解决方案可以处理所有存在“挂起”的情况
select status
, secondary_idn
, count(*) records
from theTable
where whatever
group by status, secondary_idn
having count(*) = 1
SELECT *
FROM tableName tn
WHERE tn.Status = 'Pending'
AND NOT EXISTS ( SELECT *
FROM tableName nx
WHERE nx.SECONDARY_IDN = tn.SECONDARY_IDN
AND nx.Status <> 'Pending'
);