Выберите значения для различных условий

У меня есть следующая таблица групп вопросов:

ID, NAME, DESCRIPTION, VERSION_ID

Столбцы таблицы версий:

ID, NUMBER, VERSION_STATE

VERSION_STATE - это перечисление, которое может быть 0, 1 или 2.

Мне нужно выбрать всю группу вопросов, в которой в ее версии есть vVERSION_STATE 0 или 1, но если есть группа вопросов с VERSION_STATE = 0, мне не нужно возвращать группу вопросов с VERSION_STATE = 1.

Самый простой подход:

SELECT distinct QG.id FROM healthsafety.hs_questions_group QG
LEFT OUTER JOIN (SELECT * FROM healthsafety.hs_version) VERSION
ON QG.VERSION_ID = VERSION.ID
WHERE 
VERSION.VERSION_STATE=0
OR VERSION.VERSION_STATE=1

Проблема в том, что этот запрос возвращает все группы вопросов с VERSION_STATE 0 или 1. Если я удалю предложение или и нет групп вопросов с VERSION_STATE = 0, мне нужно вернуть группы вопросов с VERSION_STATE = 1.

Я думаю, что мне нужен оператор if else или case, но я застрял. Любая идея?

Обратите внимание, что я должен реализовать это, используя критерии, поэтому мне нужно использовать самое простое решение.


person Víctor Gómez    schedule 27.03.2017    source источник


Ответы (2)


Используя общее табличное выражение и union all, где во втором запросе используется not exists() чтобы возвращать только строки, где version_state=1, когда строки с version_state=0 не существуют.

;with cte as (
  select qg.id, v.version_state
  from healthsafety.hs_questions_group qg
    inner join healthsafety.hs_version version v
      on qg.version_id = v.id
  where v.version_state in (0,1)
)
select id
from cte
where version_state = 0

union all

select qg.id
from cte
where version_state = 1
  and not exists (
    select 1
    from cte
    where version_state = 0
)
person SqlZim    schedule 27.03.2017
comment
Этот запрос возвращает те же результаты, что и мой. Может, я плохо выразился. Мне нужно вернуть все группы вопросов с VERSION_STATE = 0 и только если результатов нет, вернуть группы вопросов с VERSION_STATE = 1 - person Víctor Gómez; 28.03.2017
comment
@ VíctorGómez Обновлено на основе ваших пояснений. - person SqlZim; 28.03.2017

person    schedule
comment
Этот запрос возвращает те же результаты, что и мой. Может, я плохо выразился. Мне нужно вернуть все группы вопросов с VERSION_STATE = 0 и только если результатов нет, вернуть группы вопросов с VERSION_STATE = 1 - person Víctor Gómez; 28.03.2017
comment
@ VíctorGómez Я забыл указать () для этих двух условий в предложении where, проверьте еще раз - person LONG; 28.03.2017
comment
Я сделал запрос на основе вашего (я заказываю VERSION_STATE другой столбец в функции over, и я изменил условия where), и теперь я получаю правильные результаты - person Víctor Gómez; 28.03.2017