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 expression 和 union all
,其中第二个查询使用 not exists()
仅 return 行,其中 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
)
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)
我有一个问题组 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 expression 和 union all
,其中第二个查询使用 not exists()
仅 return 行,其中 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
)
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)