用于筛选唯一状态记录的SQL查询

用于筛选唯一状态记录的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

我需要一个SQL Server和Oracle兼容的查询来获得以下结果

表:

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