2016-06-25 40 views
-1

我有一个数据库下面值的表:DB1SQL查询来运行基于列的值

database sync_status  validation remark 
db1  successful  failed  error 
db1  successful  successful all is well 

我不想查询返回任何行,如果验证是成功的数据库DB1 。但在我的情况下,它返回的验证失败的行。

select database,sync_status,validation,remark from bcv_sync where database='db1' and validation!='successful' and validation='failed' and rownum = 1; 

但是,如果在db1验证失败的情况下查询必须返回验证失败的行。

回答

1

如果一个成功意味着数据库成功,那么您可以使用聚合。我不知道你在其他列想要的东西,但是这可能就是你所需要的东西:

select database, max(sync_status), max(validation), max(remark) 
from bcv_sync 
where database = 'db1' 
group by database 
having sum(case when validation = 'success' then 1 else 0 end) = 0 
+0

如果有多个数据库(db2,db3,...) - 假设OP会希望其他数据库的结果呢? – mathguy

+0

@mathguy。 。 。然后,op会完全省略“where”行(对于每个“数据库”,“group by”会有不同的行),或者将'in'与数据库列表一起使用。 –

1

如果我解释你的神秘的问题,那么你只想显示失败的行如果没有行那成功了:

SELECT database, 
     sync_status, 
     validation, 
     remark 
FROM (
    SELECT d.*, 
     COUNT(CASE validation WHEN 'successful' THEN 1 END) OVER() 
      AS num_success 
    FROM db1 d 
) 
WHERE validation = 'failed' 
AND num_success = 0; 
+0

如果有多个数据库(OP没有显示,他只有'db1'),那么对于“COUNT”(通过数据库进行分区)是有意义的。我认为... – mathguy