1

我们需要创建一个将这两个 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)

但这不起作用,它返回重复的行。不知道我在这里缺少什么。如果有人可以提供帮助,我将不胜感激。

谢谢

哈里什

4

2 回答 2

3

您需要汇总结果:

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 配合得很好。

于 2012-09-05T19:17:54.667 回答
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

于 2012-09-05T19:36:44.970 回答