Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.11.2012, 13:54
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
Вопрос Вложенные запросы

Ребят, подскажите как создать запрос, чтобы 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  
Старый 01.11.2012, 13:55
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Я бы, из того что у тебя в скобках сделал вьюху. Ну, а дальше все понятно
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 01.11.2012, 14:09
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

извини, я недавно плотно начал программировать и работать с базами, поэтому не понимаю пока жаргона, подробнее можно?, спасибо!
Ответить с цитированием
  #4  
Старый 01.11.2012, 14:14
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

нанёшл кое-что в яндексе, попробовал в акцессе такой запрос:
Код:
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  
Старый 01.11.2012, 14:24
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А в акцессе наверное нету вьюх... Я, грешным делом, подумал что это для сервера запрос.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #6  
Старый 01.11.2012, 14:30
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

да я на акцессе только отлаживаю программу, потом буду переводить на фаербёрд, но нужно двухсторонняя поддержка, чтобы пока первое время работать на локальной базе, а потом просто скопировать таблицы и изменить строку подключения... возможно как-то обойтись без создания временной таблицы? чтобы создавался запрос в памяти, а не на таблица на винчестере, так как пользователей возможно будет много
Ответить с цитированием
  #7  
Старый 01.11.2012, 14:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от sorockinalex
Ребят, подскажите как создать запрос, чтобы SELECT FROM выбирал не из таблицы, а из UNION трёх запросов..
Если заключить этот весь запрос в круглые скобки и поместить в FROM разве не работает?:
Цитата:
SELECT * FROM (здесь запрос с union) AS tb1, ЕщёОднаТаблица AS tb2 WHERE можно условие добавить
Ответить с цитированием
  #8  
Старый 01.11.2012, 15:46
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

видимо, где-то ошибка была, сейчас всё работает...
Код:
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  
Старый 01.11.2012, 15:52
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

только почему-то странно выдаёт результат - остальные поля кроме allowload представлены не флвжками, хотя в изначальной таблице они имеют одинаковое свойство - Логический...
Ответить с цитированием
  #10  
Старый 01.11.2012, 16:27
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 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  
Старый 01.11.2012, 16:35
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от sorockinalex
блин, в акцессе работает, делаю запросом делфи - не работает, пишет "Неопознанная ошибка"... в чём может быть дело???
А запрос попроще в этом месте нормально работает?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025