Select 两个不同条件下的值

Select values where tow different conditions

我有一个问题组 table 如下:

ID, NAME, DESCRIPTION, VERSION_ID

版本 table 列为:

ID, NUMBER, VERSION_STATE

VERSION_STATE 是一个枚举,可以是 0、1 或 2。

我需要 select 所有问题组,其版本有 vVERSION_STATE 0 或 1,但如果有一个问题组 VERSION_STATE = 0 我不必return 问题组 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

问题是此查询 return 的所有问题组都包含 VERSION_STATE 0 或 1。如果我删除 or 子句,则没有包含 VERSION_STATE = 0 的问题组, 我需要 return 问题组 VERSION_STATE = 1.

我想我需要一个 if else 或 case 语句,但我被卡住了。有什么想法吗?

请注意,我必须使用条件来实现它,因此我需要使用最简单的解决方案。

使用 common table expressionunion all,其中第二个查询使用 not exists() 仅 return 行,其中 version_state=1version_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
)
SELECT * 
FROM (

SELECT OG.ID,OG.NAME,OG.DESCRIPTION,VERSION.ID,VERSION.NUMBER,VERSION.VERSION_STATE,ROW_NUMBER()OVER(PARTITION BY OG.ID ORDER BY VERSION.VERSION_STATE ASC) as INDICATOR
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
) AS ABC

WHERE (ABC.VERSION_STATE = 0 and ABC.INDICATOR = 1) 
OR (ABC.VERSION_STATE = 1 and ABC.INDICATOR = 1)