无法合并时的 Oracle SQL 案例
Posted
技术标签:
【中文标题】无法合并时的 Oracle SQL 案例【英文标题】:Oracle SQL Case when not able to combine 【发布时间】:2012-09-05 19:14:09 【问题描述】:我们需要创建一个将这两个 SQL 语句组合在一起的视图。
SELECT g.state_cd, g.state_name,
case when s.ROLE_ID = 110 then 'Yes' else 'No' end POC
FROM us_state g
LEFT OUTER JOIN role s ON g.state_cd = s.OFC_STATE_CD
and s.role_id = 110
SELECT g.state_cd, g.state_name,
case when s.ROLE_ID = 120 then 'Yes' else 'No' end ADM
FROM us_state g
LEFT OUTER JOIN role s ON g.state_cd = s.OFC_STATE_CD
and s.role_id = 120
例如。
一个用户会有多行。有些用户的角色 = 110,有些用户的角色 = 120,有些用户两者兼而有之。那么是否可以创建 1 个结合这两者的 SQL 语句。结果应该是:
MD Maryland Yes No
NY Newyork No Yes
NJ Newhersey Yes Yes
上表暗示:
MD user has only role of 110
NY user has only the role of 120
NJ user has both roles.
希望我很清楚需要什么并且这很有意义。
我试着像这样组合它们:
SELECT g.state_cd, g.state_name,
case when s.ROLE_ID = 110 then 'Yes' else 'No' end POC,
case when s.ROLE_ID = 120 then 'Yes' else 'No' end ADM
FROM us_state g
LEFT OUTER JOIN role s ON g.state_cd = s.OFC_STATE_CD
and s.role_id in (110, 120)
但这不起作用,它会返回重复的行。不知道我在这里缺少什么。如果有人能提供帮助,我将不胜感激。
谢谢
哈里什
【问题讨论】:
【参考方案1】:您需要汇总结果:
SELECT g.state_cd, g.state_name,
max(case when s.ROLE_ID = 110 then 'Yes' else 'No' end) as POC,
max(case when s.ROLE_ID = 120 then 'Yes' else 'No' end) as ADM
FROM us_state g LEFT OUTER JOIN
role s ON g.state_cd = s.OFC_STATE_CD and s.role_id in (110, 120)
group by g.state_cd, g.state_name
事实证明,“是”和“否”与 MAX 配合得很好。
【讨论】:
哇!你们真是天才!在不到一分钟的时间里回答。希望这可以帮助像我这样的人:)。非常感谢【参考方案2】:这也是一种变体:
select state_cd, state_name
,case when (select count(*) from role r1
where r1.ofc_state_cd = s.state_cd
and r1.role_id = 110) > 0 then 'YES' else 'NO'
end as POC
,case when (select count(*) from role r2
where r2.ofc_state_cd = s.state_cd
and r2.role_id = 120) > 0 then 'YES' else 'NO'
end as ADM
from us_state s;
http://sqlfiddle.com/#!4/161e7/8
【讨论】:
以上是关于无法合并时的 Oracle SQL 案例的主要内容,如果未能解决你的问题,请参考以下文章