SQL为用户表保留了连接

时间:2013-05-26 19:31:52

标签: sql oracle join self-join

我有以下示例表(简化了我真正拥有的内容,因为那里有更多的连接)

|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。

有任何提示吗?如果我有一个起点,我很乐意尝试:)

提前致谢

1 个答案:

答案 0 :(得分: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.