SQL Advanced IIF с использованием MS Access

Можно ли использовать SQL-запрос в логической проверке оператора IIF? У меня есть штатное расписание, в котором содержится вся ожидаемая общая информация о персонале. Одно из полей IsManager является логическим, и я использую операторы IIF для изменения вывода запроса в зависимости от того, установлено ли у кого-то значение true или нет.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я применяю это к таблице «один ко многим», она проверяет, имеет ли текущая запись значение поля IsManager, равное истине. Я хотел бы, чтобы он проверил, установлено ли у текущего человека, выполняющего запрос, значение поля true.

SELECT TB2.ID, IIF(TB1.IsManager, TB1.LastName, 'Restricted'), IIF(TB1.IsManager, TB1.FirstName, 'Restricted') 
FROM TB1 INNER JOIN TB2 ON TB1.EmployeeNumber = TB2.EmployeeNumber

Это работает, если в проверяемой мной записи есть IsManager=True. Я хотел бы проверить текущего пользователя на наличие оператора IIF, который я делаю в других запросах, используя следующие

SELECT IsManager 
FROM TB1 
WHERE Username=currentUser

Где currentUser - это переменная VBA Environ("USERNAME"), которая также записывается в таблице сведений о персонале.

Итак, могу ли я объединить их и выполнить IFF с указанным выше запросом, например:

SELECT IIF(SELECT IsManager 
FROM TB1 
WHERE Username=currentuser, TB1.LastName, 'Restricted') FROM .... etc etc

Если нет, есть альтернативный метод, который я могу использовать, доступный для MC Access SQL.


person iShaymus    schedule 20.07.2017    source источник
comment
Отредактируйте свой вопрос и предоставьте образцы данных и желаемые результаты.   -  person Gordon Linoff    schedule 20.07.2017


Ответы (2)


Вам просто нужно два таких соединения

SELECT 
  TB2.ID, 
  IIF(AM_I_MANAGER.IsManager, TB1.LastName, 'Restricted'), 
  IIF(AM_I_MANAGER.IsManager, TB1.FirstName, 'Restricted') 
FROM TB1
CROSS JOIN TB1 AS AM_I_MANAGER ON AM_I_MANAGER.Username=currentUser 
JOIN TB2 ON TB1.EmployeeNumber = TB2.EmployeeNumber

Здесь мы используем перекрестное соединение, потому что AM_I_MANAGER.Username=currentUser вернет 1 строку. Затем мы используем эту одну строку для каждой строки таблицы TB1 (таким образом, перекрестное соединение "пересекает" только 1 строку). Если этот фильтр возвращает более одной строки, вы не получите хороших результатов.

person Hogan    schedule 20.07.2017
comment
Я получаю следующую ошибку при запуске этой синтаксической ошибки в предложении FROM. Проверял синтаксис трижды и не видит. - person iShaymus; 23.07.2017
comment
По-видимому, MS Access не использует CROSS JOIN - person iShaymus; 23.07.2017
comment
@iShaymus - просто выньте КРЕСТ, должно быть хорошо. - person Hogan; 23.07.2017

Вы можете использовать DLookup в своем запросе:

PARAMETERS Username Text (255);
SELECT 
    TB2.ID, 
    IIF(DLookup("IsManager", "TB1", "Username = '" & Username & "')"), TB1.LastName, 'Restricted'),
    IIF(DLookup("IsManager", "TB1", "Username = '" & Username & "')"), TB1.FirstName, 'Restricted') 
FROM 
    TB1 
INNER JOIN 
    TB2 
    ON TB1.EmployeeNumber = TB2.EmployeeNumber
person Gustav    schedule 20.07.2017