2016-06-25 42 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