【问题标题】:SQL left join for users table用户表的 SQL 左连接
【发布时间】:2013-05-26 19:31:52
【问题描述】:

我有以下示例表(根据我的实际情况进行了简化,因为那里还有一些连接)

|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 拥有这些权限,而用户 2 没有。这对我来说非常有用,可以确保用户拥有相同的权限。

我已完成 SQL 以获取顶级表,因此我可以查看权限。

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

请问有什么提示吗?如果我有一个起点,我很乐意尝试:)

提前致谢

【问题讨论】:

    标签: sql oracle join self-join


    【解决方案1】:

    您正在寻找的内容称为“透视”。一种方法是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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      相关资源
      最近更新 更多