Как добавить логический столбец в набор результатов SQL на основе сравнения со второй таблицей - PullRequest
0 голосов
/ 27 сентября 2011

По сути, я получил ответ на первую часть вопроса, и вот заявление SQL, которое у меня есть до сих пор ...

SELECT DbaRolePrivs.GRANTEE,
       DbaRolePrivs.GRANTED_ROLE,
       ApplicationRoleDefinition.ROLE,
       ApplicationRoledefinition.description_tx, 
       CASE
         WHEN GRANTED_ROLE = ROLE AND GRANTEE = USERNAME THEN
           'T'
         ELSE
           'F'
       END AS checkMark
FROM DBA_ROLE_PRIVS DbaRolePrivs, APPLICATION_ROLE_DEFINITION ApplicationRoleDefinition

Вот логика, которую я пытаюсь выполнить на простом английском языке.

"Учитывая список всех ролей и их описания, пометьте каждую роль как ИСТИНА или ЛОЖЬ в зависимости от того, была ли текущему выбранному ИМЯ ПОЛЬЗОВАТЕЛЯ предоставлена ​​эта роль на основе их собственного списка GrantedRoles."

Сейчас он, конечно, возвращает двойной список, поскольку в разделе «случай, когда» каждая из предоставленных ролей сравнивается с общим списком ролей.(Я говорю «дубликаты», потому что у тестового пользователя есть только две роли, в текущем запросе SQL он будет возвращать строку для каждой роли для каждой возможной роли.

Я едва работал с SQL, поэтому я более привыкC ++, Objective-C и т. д. Действительно, все, что мне нужно в разделе «случай, когда», это проверить, существует ли вообще текущий ROLE в столбце GRANTED_ROLE. Я видел функцию EXISTS, но, похоже, она предназначена исключительно длянаборы результатов, такие как «ГДЕ СУЩЕСТВУЕТ».

Заранее спасибо, я знаю, что для тех, кто часто работал с базами данных, это, наверное, просто, я только начал.

1 Ответ

1 голос
/ 27 сентября 2011

Вам необходимо выполнить внешнее соединение, а затем проверить, было ли соединение успешным или нет.Если внешнее соединение завершается неудачно, строка все еще возвращается, но все столбцы DbaRolePrivs будут иметь значение null

SELECT  DbaRolePrivs.GRANTEE,
        DbaRolePrivs.GRANTED_ROLE,
        ApplicationRoleDefinition.ROLE,
        ApplicationRoledefinition.description_tx,
        NVL2( DbaRolePrivs.GRANTED_ROLE, 'T', 'F' ) AS checkMark
FROM    DBA_ROLE_PRIVS DbaRolePrivs
    ,   APPLICATION_ROLE_DEFINITION ApplicationRoleDefinition
WHERE   ApplicationRoleDefinition.ROLE = DbaRolePrivs.GRANTED_ROLE (+)
AND     USERNAME                       = DbaRolePrivs.GRANTEE      (+)
...