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 есть эти разрешения, а у пользователя 2 нет. Это было бы очень полезно для меня, чтобы гарантировать, что пользователи имеют одинаковые разрешения.

Я сделал SQL, чтобы получить верхнюю таблицу, чтобы я мог видеть разрешения.

Я думал, что ответом может быть какое-то левое соединение само по себе, но все, что я пытаюсь, похоже, заканчивается недопустимым SQL.

Любые подсказки, пожалуйста? Я буду рад поэкспериментировать, если получу отправную точку :)

заранее спасибо


person RNJ    schedule 26.05.2013    source источник


Ответы (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 поддерживает ключевое слово PIVOT. Вы можете использовать его для выполнения того же самого:

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

Пример обоих подходов в SQL Fiddle.

person Andomar    schedule 26.05.2013