![]() |
|
|
#1
|
|||
|
|||
![]() Ребят, подскажите как создать запрос, чтобы SELECT FROM выбирал не из таблицы, а из UNION трёх запросов.. Поясню:
есть таблица прав доступа к модулю, в ней указаны: пользователь, группа пользователей, роль есть таблицы: права пользователей, роли.. делаю три запроса для выборки идентификаторов попользователей, соединяю их в единый запрос, в котором содержатся все пользователи, входящие как в группы пользователей, разрешённых для работы с модулем, как в роли, так и сами пользователи, разрешённые для работы с модулем... данные в этом запросе повторяются, так как один и тот же пользователь может быть и в группе и состоять в какой-нибудь роли, или просто иметь личные права доступа к модулю... теперь нужно сделать DISTINCT всего запроса, состоящего из этих трёх и отсеять пользователя по его идентификатору и названию модуля, чтобы узнать имеет ли он на этот модуль права и какие... как получившийся вопрос, состоящий из трёх вложить в FROM основного запроса??? Код:
SELECT DISTINCT pin, employeepin, module,allowload FROM ( SELECT DISTINCT modulerights.pin, modulerights.employeepin, modules.module, modulerights.allowload FROM modules INNER JOIN modulerights ON modules.pin = modulerights.modulepin; UNION SELECT modulerights.pin, emploeegroups.employeepin, modulerights.modulepin, modulerights.allowload FROM (groups INNER JOIN modulerights ON groups.pin = modulerights.employeegrouppin) INNER JOIN emploeegroups ON groups.pin = emploeegroups.grouppin; UNION SELECT modulerights.pin, employeeroles.employeepin, modules.module, modulerights.allowload FROM (roles INNER JOIN (modules INNER JOIN modulerights ON modules.pin = modulerights.modulepin) ON roles.pin = modulerights.rolepin) INNER JOIN employeeroles ON roles.pin = employeeroles.rolepin) ) WHERE employeepin=1, module='AddCompany' Последний раз редактировалось lmikle, 01.11.2012 в 21:31. |
#2
|
||||
|
||||
![]() Я бы, из того что у тебя в скобках сделал вьюху. Ну, а дальше все понятно
![]() Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
![]() извини, я недавно плотно начал программировать и работать с базами, поэтому не понимаю пока жаргона, подробнее можно?, спасибо!
|
#4
|
|||
|
|||
![]() нанёшл кое-что в яндексе, попробовал в акцессе такой запрос:
Код:
CREATE VIEW temp AS SELECT DISTINCT modulerights.pin, modulerights.employeepin, modules.module, modulerights.allowload FROM modules INNER JOIN modulerights ON modules.pin = modulerights.modulepin; UNION SELECT modulerights.pin, emploeegroups.employeepin, modulerights.modulepin, modulerights.allowload FROM (groups INNER JOIN modulerights ON groups.pin = modulerights.employeegrouppin) INNER JOIN emploeegroups ON groups.pin = emploeegroups.grouppin; UNION SELECT modulerights.pin, employeeroles.employeepin, modules.module, modulerights.allowload FROM (roles INNER JOIN (modules INNER JOIN modulerights ON modules.pin = modulerights.modulepin) ON roles.pin = modulerights.rolepin) INNER JOIN employeeroles ON roles.pin = employeeroles.rolepin SELECT DISTINCT pin, employeepin, module,allowload FROM temp отказался работать, не узнаёт служебного слова View |
#5
|
||||
|
||||
![]() А в акцессе наверное нету вьюх... Я, грешным делом, подумал что это для сервера запрос.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#6
|
|||
|
|||
![]() да я на акцессе только отлаживаю программу, потом буду переводить на фаербёрд, но нужно двухсторонняя поддержка, чтобы пока первое время работать на локальной базе, а потом просто скопировать таблицы и изменить строку подключения... возможно как-то обойтись без создания временной таблицы? чтобы создавался запрос в памяти, а не на таблица на винчестере, так как пользователей возможно будет много
|
#7
|
||||
|
||||
![]() Цитата:
Цитата:
|
#8
|
|||
|
|||
![]() видимо, где-то ошибка была, сейчас всё работает...
Код:
SELECT DISTINCT pin, employeepin, module, allowloadd, allow1, allow2, allow3, allow4, allow5, allow6, allow7, allow8, allow9, allow10, allow11, allow12, allow13, allow14, allow15, allow16, allow17, allow18, allow19, allow20 FROM ( SELECT modulerights.pin, modulerights.employeepin, modules.module, modulerights.allowloadd, modulerights.allow1, modulerights.allow2, modulerights.allow3, modulerights.allow4, modulerights.allow5, modulerights.allow6, modulerights.allow7, modulerights.allow8, modulerights.allow9, modulerights.allow10, modulerights.allow11, modulerights.allow12, modulerights.allow13, modulerights.allow14, modulerights.allow15, modulerights.allow16, modulerights.allow17, modulerights.allow18, modulerights.allow19, modulerights.allow20 FROM (modules INNER JOIN modulerights ON modules.pin = modulerights.modulepin) UNION SELECT modulerights.pin, employeeroles.employeepin, modules.module, modulerights.allowloadd, modulerights.allow1, modulerights.allow2, modulerights.allow3, modulerights.allow4, modulerights.allow5, modulerights.allow6, modulerights.allow7, modulerights.allow8, modulerights.allow9, modulerights.allow10, modulerights.allow11, modulerights.allow12, modulerights.allow13, modulerights.allow14, modulerights.allow15, modulerights.allow16, modulerights.allow17, modulerights.allow18, modulerights.allow19, modulerights.allow20 FROM (roles INNER JOIN (modules INNER JOIN modulerights ON modules.pin = modulerights.modulepin) ON roles.pin = modulerights.rolepin) INNER JOIN employeeroles ON roles.pin = employeeroles.rolepin UNION SELECT modulerights.pin, emploeegroups.employeepin, modules.module, modulerights.allowloadd, modulerights.allow1, modulerights.allow2, modulerights.allow3, modulerights.allow4, modulerights.allow5, modulerights.allow6, modulerights.allow7, modulerights.allow8, modulerights.allow9, modulerights.allow10, modulerights.allow11, modulerights.allow12, modulerights.allow13, modulerights.allow14, modulerights.allow15, modulerights.allow16, modulerights.allow17, modulerights.allow18, modulerights.allow19, modulerights.allow20 FROM modules INNER JOIN ((groups INNER JOIN modulerights ON groups.pin = modulerights.employeegrouppin) INNER JOIN emploeegroups ON groups.pin = emploeegroups.grouppin) ON modules.pin = modulerights.modulepin ) WHERE employeepin=51 and module="OilGasSprt" |
#9
|
|||
|
|||
![]() только почему-то странно выдаёт результат - остальные поля кроме allowload представлены не флвжками, хотя в изначальной таблице они имеют одинаковое свойство - Логический...
![]() |
#10
|
|||
|
|||
![]() блин, в акцессе работает, делаю запросом делфи - не работает, пишет "Неопознанная ошибка"... в чём может быть дело???
Код:
DM.Query.SQL.Clear; DM.Query.SQL.Add('SELECT DISTINCT pin, employeepin, module, allowload, allow1, allow2, allow3, allow4, allow5, allow6, allow7, allow8, allow9, allow10, allow11, allow12, allow13, allow14, allow15, allow16, allow17, allow18, allow19, allow20'); DM.Query.SQL.Add('FROM (SELECT modulerights.pin, modulerights.employeepin, modules.module, modulerights.allowload, modulerights.allow1, modulerights.allow2, modulerights.allow3, modulerights.allow4, modulerights.allow5, modulerights.allow6,modulerights.allow7,'); DM.Query.SQL.Add('modulerights.allow8, modulerights.allow9, modulerights.allow10,'); DM.Query.SQL.Add('modulerights.allow11, modulerights.allow12, modulerights.allow13, modulerights.allow14, modulerights.allow15, modulerights.allow16, modulerights.allow17, modulerights.allow18, modulerights.allow19, modulerights.allow20'); DM.Query.SQL.Add('FROM (modules INNER JOIN modulerights ON modules.pin = modulerights.modulepin)'); DM.Query.SQL.Add('UNION'); DM.Query.SQL.Add('SELECT modulerights.pin, employeeroles.employeepin, modules.module, modulerights.allowload, modulerights.allow1, modulerights.allow2, modulerights.allow3, modulerights.allow4, modulerights.allow5, modulerights.allow6, modulerights.allow7,'); DM.Query.SQL.Add('modulerights.allow8, modulerights.allow9, modulerights.allow10,'); DM.Query.SQL.Add('modulerights.allow11, modulerights.allow12, modulerights.allow13, modulerights.allow14, modulerights.allow15, modulerights.allow16, modulerights.allow17, modulerights.allow18, modulerights.allow19, modulerights.allow20'); DM.Query.SQL.Add('FROM (roles INNER JOIN (modules INNER JOIN modulerights ON modules.pin = modulerights.modulepin) ON roles.pin = modulerights.rolepin) INNER JOIN employeeroles ON roles.pin = employeeroles.rolepin'); DM.Query.SQL.Add('UNION'); DM.Query.SQL.Add('SELECT modulerights.pin, emploeegroups.employeepin, modules.module, modulerights.allowload, modulerights.allow1, modulerights.allow2, modulerights.allow3, modulerights.allow4, modulerights.allow5, modulerights.allow6, modulerights.allow7,'); DM.Query.SQL.Add('modulerights.allow8, modulerights.allow9, modulerights.allow10,'); DM.Query.SQL.Add('modulerights.allow11, modulerights.allow12, modulerights.allow13, modulerights.allow14, modulerights.allow15, modulerights.allow16, modulerights.allow17, modulerights.allow18, modulerights.allow19, modulerights.allow20'); DM.Query.SQL.Add('FROM modules INNER JOIN ((groups INNER JOIN modulerights ON groups.pin = modulerights.employeegrouppin) INNER JOIN emploeegroups ON groups.pin = emploeegroups.grouppin) ON modules.pin = modulerights.modulepin'); DM.Query.SQL.Add(')'); DM.Query.SQL.Add('WHERE employeepin=51 and module="OilGasSprt"'); showmessage(DM.Query.SQL.Text); DM.Query.Active:=true; |
#11
|
||||
|
||||
![]() Цитата:
|