Как передать несколько значений параметра в Access? - PullRequest
4 голосов
/ 30 ноября 2011

Предпосылки / Общая цель

  • У меня есть таблица Excel, содержащая список элементов, которые необходимо проверить для определенных ролей.
    • Роли имеют участников
    • Роли могут иметь роли участников, у которых есть свои пользователи.
  • Мне нужно собрать общее количество пользователей, которые могутпротестируйте данную функцию, чтобы получить имена и числа для некоторых метрик.
  • Я поместил пользователей, роли и роли участников в базу данных Access для некоторых быстрых запросов
  • Теперь, просто пытаясь получитьправильная информация.Я не возражаю против ввода списка ролей и его повторения.
  • Я бы хотел не добавлять все тестовые элементы для каждой роли в БД (их много иэта задача должна быть достаточно быстрой).

Структура БД

                       +---------------+
    +------------+     |RolesUsers     |
    |Roles       |     |---------------|    +---------------+
    |+-----------|     |ID             |    |Users          |
 +-+|ID          |+---+|RoleID         |    |---------------|
 |  |RoleName    |     |UserID         |+--+|ID             |
 |  +------------+     +---------------+    |UserName       |
 |                                          +---------------+
 |
 |  +-----------------+
 |  |RolesMemberRoles |
 |  |-----------------|
 |  |ID               |
 +-+|RoleID           |
 +-+|MemberRoleID     |
    +-----------------+

Цель

  • Передача списка ролей в запрос (либо через перечисленный параметр, либо через список строк)
  • Возвращает количество уникальных пользователей, которые принадлежат к любой из этих ролей или к любой из их ролей члена
  • Быстро и грязно - не нужноbe fancy

Текущий запрос доступа

  • Возвращает пользователей, принадлежащих к роли или ее ролям-членам для данной роли, введенной с помощью параметра
PARAMETERS p_RoleName Text ( 255 );
SELECT Roles.RoleName, Users.UserName
FROM 

(RolesUsers INNER JOIN Users ON RolesUsers.UserID = Users.ID) 
INNER JOIN Roles ON RolesUsers.RoleID = Roles.ID

Where RolesUsers.RoleID In (Select ID from Roles where Roles.RoleName = p_RoleName)

UNION SELECT Roles.RoleName, Users.UserName
FROM 

(RolesUsers INNER JOIN Users ON RolesUsers.UserID = Users.ID) 
INNER JOIN Roles ON RolesUsers.RoleID = Roles.ID

Where RolesUsers.RoleID IN (
SELECT RolesSubroles.SubRoleID FROM RolesSubroles INNER JOIN Roles ON RolesSubRoles.RoleID = Roles.ID 
where Roles.RoleName = p_RoleName);

Ideas So Far

  • Найдено интересный пост о том, как передать строку текста в предложение where с помощью Instr ().Не уверен, как я мог бы подстроить это к моей ситуации, хотя.

Ответы [ 2 ]

1 голос
/ 04 декабря 2011

Для достижения цели 1 вы можете использовать предложенное выше предложение Рему, чтобы ввести список RoleNames в предложение WHERE со следующим запросом. Однако, возможно, имеет смысл просто удалить предложение WHERE, выполнить запрос, а затем вставить в Excel для (цели 3) «быструю и грязную» фильтрацию.

SELECT DISTINCT Roles_1.RoleName,
            Users.UserName
FROM   Users
   INNER JOIN ((Roles
                INNER JOIN (RolesMemberRoles
                            INNER JOIN Roles AS Roles_1
                              ON RolesMemberRoles.MemberRoleID = Roles_1.ID)
                  ON Roles.ID = RolesMemberRoles.RoleID)
               INNER JOIN RoleUsers
                 ON Roles.ID = RoleUsers.RoleID)
     ON Users.ID = RoleUsers.UserID
WHERE  Roles_1.RoleName In ( "Prez", "Veep", "Staffer" )
ORDER  BY Roles_1.RoleName,
      Users.UserName;  

Чтобы вернуть количество пользователей, способных выполнять различные роли (цель 2), вы можете выполнить следующее.

SELECT InheritedRoles.RoleName,
   Count(*) AS NumOfTestersAvailable
FROM   (SELECT DISTINCT Roles_1.RoleName,
                    Users.UserName
    FROM   Users
           INNER JOIN ((Roles
                        INNER JOIN (RolesMemberRoles
                                    INNER JOIN Roles AS Roles_1
                                      ON RolesMemberRoles.MemberRoleID =
                                   Roles_1.ID)
                          ON Roles.ID = RolesMemberRoles.RoleID)
                       INNER JOIN RoleUsers
                         ON Roles.ID = RoleUsers.RoleID)
             ON Users.ID = RoleUsers.UserID) AS InheritedRoles
GROUP  BY InheritedRoles.RoleName
ORDER BY InheritedRoles.RoleName;  

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

0 голосов
/ 05 декабря 2011

Предложение. В вашем проекте Access запросите данные электронной таблицы, используя Access SQL, например. создать JOIN s между таблицами Access и данными Excel, возможно, используя разлинованные таблицы.

...