2016-06-25 5 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» over (раздел по базе данных). Я думаю... – mathguy

Смежные вопросы