|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
Всем привет! Есть две таблицы со следующим набором данных: 1. Таблица Роли: содержит информацию о пользовательских ролях в системе и объектах, к которым эти роли дают доступ. Код: plaintext 1. 2. 3. 4.
2. Таблица Контроли: перечислены объекты в системе, к которым нужно подтянуть данные из Таблицы роли, чтобы получить список ролей, которые дают доступ к объектам. Код: plaintext 1. 2. 3.
Согласно логике работы системы, пользователь получит доступ к данным: если из таблицы Контроли ему будет выдана роль, в которую входят оба объета: VKO и VKS. Т.е. если пользователю будет выдана роль LOG из таблицы Роли, то доступ к данным он получит, а если будет выдана роль EOSP, то доступа не будет, так как это роль дает доступ только к одному объекту: VKO. Вопрос заключается в том, как соединить таблицы, чтобы роль EOSP не выводилась в результирующий список, так как она не дает доступ к данным. Возможно соединить результирующую таблицу саму на себя по названию роли и добавить условие, что объект<>объект_1, но это частное решение задачи, потому что возможны ситуации, когда доступ управляется больше чем двумя объектами. Буду очень благодарен за совет. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2018, 19:07 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
GROUP BY роль HAVING COUNT(DISTINCT объект)=2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2018, 19:31 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
AkinaGROUP BY роль HAVING COUNT(DISTINCT объект)=2 Count (distinct ) access не поддерживает. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 07:11 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
mnbvcx , ну так я и пишу не запрос, а идею реализации. Как уж она там будет реализована - подзапросом, пользовательской функцией или ещё как,- дело десятое. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 07:37 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
AkinaGROUP BY роль HAVING COUNT(DISTINCT объект)=2 Спасибо, но это тоже частный случай решения задачи, когда доступ к данным управляется двумя объектами. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 09:23 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
gul.dima, то, что ты хочешь получить, называется "Реляционное деление" Такое, вроде бы, в Акцессе должно сработать @t1 - твоя таб.Роли , @t2 - таблица Контроли Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 10:06 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
gul.dimaэто тоже частный случай решения задачи, когда доступ к данным управляется двумя объектами.Ну так и двойка там не догма... как бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 15:38 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
Akina, Спасибо, за комментарий, согласен, что 2 это не догма. Но, думаю, count в данном случае не подходит. На том объеме данных, что я разместил в качестве примера, этого не видно. Но допустим такую ситуацию, когда роль EOSP тоже дает доступ к двум объектам: к VKO и VK X . Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 15:55 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
gul.dimaВ таком случае count для роли EOSP=2А то, что ДО ГРУППИРОВКИ там ещё какое-то WHERE должно быть - не? После него двух-то не останется... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 15:57 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
И вообще - почитали бы Вы теорию про EAV и типовые операции с ею... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 15:58 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
court, Отличное решение, спасибо большое! Но, к сожалению, в Access не работает, выдает ошибку в части: Код: plaintext 1. 2. 3.
Мне кажется, что он ругается на условие соединения таблиц t1.Роль=t.Роль. Но теперь я буду знать, что гуглить надо "Реляционное деление". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 16:02 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
gul.dimaНо теперь я буду знать, что гуглить надо "Реляционное деление".держи, я уже нагуглил :) - http://www.sql-tutorial.ru/ru/book_relational_division.html Кстати, первый (и второй) запрос по ссылке, это то что предлагает Akina Просто нужно весь этот GROUP BY / HAVING "брать" от inner join-a твоих таблиц (или where Роли.Объект in (select Объект from Контроли)) Но если дело действительно "дойдёт" до COUNT(DISTINCT .. ) - то, в Аксе, будет не просто ... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 16:11 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
gul.dimaМне кажется, что он ругается на условие соединения таблиц t1.Роль=t.РольЯсен пень - у тебя в источнике данных нет таблицы t . ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 16:30 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
Akinagul.dimaМне кажется, что он ругается на условие соединения таблиц t1.Роль=t.РольЯсен пень - у тебя в источнике данных нет таблицы t .Нее, там в самом деле что-то Акцесса такое условие не принимает ... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 16:36 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
Ааа... так это коррелированный подзапрос? да, обломись. Перепиши на обычный JOIN. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 16:41 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
gul.dimaНо, к сожалению, в Access не работаетВот так Акцесс "принял" Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 17:33 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
court, Спасибо большое, вы очень помогли! Правда Access не справился с 300 тыс. строками, хотя я оставил запрос часа на три. Видимо нужно переходить на другую СУБД, несмотря на то, что интеграция с Excel и привычный графический редактор запросов подкупают. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2018, 16:29 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
gul.dimaAccess не справился с 300 тыс. строками, хотя я оставил запрос часа на три. Видимо, из-за Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2018, 16:43 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
Если правильно понимаю. Код: sql 1. 2. 3. 4.
Но, может, и глупость. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2018, 17:04 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
__Michellegul.dimaAccess не справился с 300 тыс. строками, хотя я оставил запрос часа на три. Видимо, из-за Код: sql 1.
Да, это можно нужно заменить на not exists Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 09:24 |
|
Соединение двух таблиц при выполнении двух и более условий
|
|||
---|---|---|---|
#18+
gul.dimacourt, Спасибо большое, вы очень помогли! Правда Access не справился с 300 тыс. строками, хотя я оставил запрос часа на три. Видимо нужно переходить на другую СУБД, несмотря на то, что интеграция с Excel и привычный графический редактор запросов подкупают. В Контроли, объект всегда уникальный ? Т.е. не может быть такой ситуации : Код: plaintext 1. 2. 3. 4.
? Если ответ "Да", то эту часть из запроса можно удалить Код: sql 1. 2. 3. 4. 5.
...нуу и + индексы полюбому нужен индекс на Роль в таб.Роли Если ответ на вопрос выше "Нет" - ещё индексы на {Объект,Имя поля} в Роли и такой же в Контроли (поле "Значение", я так понял, битовое, на него не нужно) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 09:35 |
|
|
start [/forum/topic.php?fid=45&msg=39633538&tid=1611503]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 287ms |
total: | 425ms |
0 / 0 |