Право T-SQL объединяется со всеми записями, включая выбранный столбец - PullRequest
3 голосов
/ 25 мая 2010

У меня есть следующий запрос, который производит вывод ниже;

SELECT
    TBLUSERS.USERID,
    TBLUSERS.ADusername,
    TBLACCESSLEVELS.ACCESSLEVELID,
    TBLACCESSLEVELS.AccessLevelName
FROM
    TBLACCESSLEVELS INNER JOIN 
    TBLACCESSRIGHTS ON TBLACCESSLEVELS.ACCESSLEVELID = TBLACCESSRIGHTS.ACCESSLEVELID INNER JOIN
    TBLUSERS ON TBLACCESSRIGHTS.USERID = TBLUSERS.USERID

Вывод такой;

29   administrator   1           AllUsers           
29   administrator   2   JobQueue                   
29   administrator   3   Telephone Directory Admin  
29   administrator   4   Jobqueueadmin              
29   administrator   5   UserAdmin                  
29   administrator   6   Product System             
27   alan            1   AllUsers                   
97   andy            1   AllUsers                   
26   barry           1   AllUsers                   
26   barry           2   JobQueue                   
26   barry           3   Telephone Directory Admin  
26   barry           4   Jobqueueadmin              
26   barry           5   UserAdmin                  
26   barry           6   Product System             
26   barry           7   Newseditor                 
26   barry           8   GreetingBoard              

Что я хотел бы сделать, так это изменить запрос, чтобы я получил все уровни доступа независимо от того, есть ли запись для этого пользователя. Я также хотел бы сделать что-то вроде существующего случая, чтобы получить вывод, подобный следующему;

29    administrator   1       AllUsers                       True
29    administrator   2       JobQueue                       True
29    administrator   3       Telephone Directory Admin      True
29    administrator   4       Jobqueueadmin                  True
29    administrator   5       UserAdmin                      True
29    administrator   6       Product System                 True
29    administrator   7       Newseditor                     False
29    administrator   8       GreetingBoard                  False
27    alan            1       AllUsers                       True
27    alan            2       JobQueue                       False
27    alan            3       Telephone Directory Admin      False
27    alan            4       Jobqueueadmin                  False
27    alan            5       UserAdmin                      False
27    alan            6       Product System                 False
27    alan            7       Newseditor                     False
27    alan            8       GreetingBoard                  False
97    andy            1       AllUsers                       True
97    andy            2       JobQueue                       False
97    andy            3       Telephone Directory Admin      False
97    andy            4       Jobqueueadmin                  False
97    andy            5       UserAdmin                      False
97    andy            6       Product System                 False
97    andy            7       Newseditor                     False
97    andy            8       GreetingBoard                  False
26    Barry           1       AllUsers                       True
26    Barry           2       JobQueue                       True
26    Barry           3       Telephone Directory Admin      True
26    Barry           4       Jobqueueadmin                  True
26    Barry           5       UserAdmin                      True
26    Barry           6       Product System                 True
26    Barry           7       Newseditor                     True
26    Barry           8       GreetingBoard                  True

Таким образом, правила ВСЕГДА показывают ВСЕ записи для ACCESSLEVELS и где EXISTS в ACCESSRIGHTS выдают true / false, чтобы показать это.

Надеюсь, это имеет смысл, и, надеюсь, вам не нужны определения таблиц, поскольку все, с чем мне нужно работать, находится в исходном Query. Мне просто нужен способ немного манипулировать им и получить соединение в нужном месте.

Спасибо. Pace

1 Ответ

3 голосов
/ 25 мая 2010
SELECT  u.USERID,
        u.ADusername,
        al.ACCESSLEVELID,
        al.AccessLevelName,
        CASE WHEN ar.accesslevelid IS NULL THEN 'False' ELSE 'True' END AS Access
FROM    tblusers u
CROSS JOIN
        tblaccesslevels al
LEFT JOIN
        tblaccessrights ar
ON      ar.ACCESSLEVELID = al.ACCESSLEVELID
        AND ar.USERID = u.USERID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...