Возврат всех результатов из левой таблицы, когда в правой таблице присутствует NULL, и результатов внутреннего соединения, если в правой таблице нет пустых значений - PullRequest
0 голосов
/ 05 мая 2018

Привет, просто интересно, возможен ли такой сценарий?

У меня есть две таблицы и таблица отношений для создания связей между двумя таблицами. См. Таблицы ниже для простого представления;

| Security ID   | Security Group |
| 1             | Admin          |
| 2             | Basic          |

| Security ID   | Access ID      |
| 1             | NULL           |
| 2             | 1              |

| Function ID   | Function Code  |
| 1             | Search         | 
| 2             | Delete         |

Чего я хочу добиться, проверяя таблицу отношений, я хочу вернуть все функции, к которым у пользователя в группе безопасности есть доступ. Если пользователь назначен группе безопасности, которая содержит значение NULL в таблице отношений, предоставьте ему доступ ко всем функциям.

Например, пользователь из группы безопасности «Базовый» будет иметь доступ к функции поиска, а пользователь из группы безопасности «Администратор» должен иметь доступ как к поиску, так и к удалению.

Причина, по которой он настроен таким образом, заключается в том, что пользователь может иметь от 0 до многих групп безопасности, и список функций очень большой, требующий использования белого списка функций, к которому вы можете получить доступ, вместо списка черного списка функций. Вы не можете получить доступ.

Спасибо, что уделили время.

1 Ответ

0 голосов
/ 05 мая 2018

образец ваших таблиц:

CREATE TABLE #G
(
    Security_ID INT,
    Security_Group      VARCHAR(32)
)

INSERT INTO #G
VALUES (1, 'Admin'), (2, 'Basic')

CREATE TABLE #A
(
    Security_ID INT,
    Access_ID   INT
)

INSERT INTO #A
VALUES (1, NULL), (2, 1)

CREATE TABLE #F
(
    Function_ID INT,
    Function_CODE   VARCHAR(32)
)

INSERT INTO #F
VALUES (1, 'Search'), (2, 'Delete')

Запрос:

SELECT #G.Security_Group, #F.Function_CODE
FROM #G 
    JOIN #A ON #G.Security_ID = #A.Security_ID
    JOIN #F ON #F.Function_ID = #A.Access_ID OR #A.Access_ID IS NULL

Отбрасывание таблиц образцов:

DROP TABLE #G
DROP TABLE #A
DROP TABLE #F
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...