2013-05-26 18 views
2

我有以下示例表(从我真的有因为里面还有一些更多的加入简体)SQL左连接,为用户表

|permission|username| 
| perm1 | u1  | 
| perm2 | u1  | 
| perm3 | u1  | 
| perm1 | u2  | 
| perm4 | u2  | 

我有很多用户和很多团体在此表中

我遇到了用户权限问题,其中一些用户可以在我的应用程序中执行某些操作,而其他用户则无法执行此操作。目前我不得不手动通过并找出差异。

我想箱子从上面的表的查询,让我这个样子

|permission| u1 | u2 | 
|perm1  | 1 | 1 | 
|perm2  | 1 | 0 | 
|perm3  | 1 | 0 | 
|perm4  | 0 | 1 | 

我真的不希望1和0的用户下一个答案,但我想要的东西,我可以很容易地可视化用户1拥有这些权限,而user2不具有这些权限。这对我确保用户具有相同的权限非常有用。

我已经完成了SQL来获取顶部表,所以我可以看到权限。

我在想,某种左连接本身可能会有答案,但我所尝试的一切似乎最终都是无效的SQL。

有什么提示吗?我很高兴做实验,如果我得到一个起点:)

在此先感谢

回答

3

你要寻找的被称为“旋转”。要做到这一点的方法之一是group by,如:

select permission 
,  count(case when username = 'u1' then 1 end) as User1 
,  count(case when username = 'u2' then 1 end) as User2 
,  count(case when username = 'u3' then 1 end) as User3 
,  ... 
from YourTable 
group by 
     permission 

它看起来像Oracle支持the PIVOT keyword。你可以用它来完成同样的事情:

select * 
from YourTable 
pivot (
     count(*) as HasPermission 
     for (username) in ('u1', 'u2', 'u3', ...) 
     ); 

Example for both approaches at SQL Fiddle.

+0

完美 - 感谢您的快速反应! – RNJ