powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Соединение двух таблиц при выполнении двух и более условий
21 сообщений из 21, страница 1 из 1
Соединение двух таблиц при выполнении двух и более условий
    #39631960
gul.dima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Есть две таблицы со следующим набором данных:
1. Таблица Роли: содержит информацию о пользовательских ролях в системе и объектах, к которым эти роли дают доступ.
Код: plaintext
1.
2.
3.
4.
 Роль	Объект	Имя поля Значение 
EOSP	VKO	ACTVT     1
LOG	VKO	ACTVT	  1
LOG	VKS	ACTVT	  1

2. Таблица Контроли: перечислены объекты в системе, к которым нужно подтянуть данные из Таблицы роли, чтобы получить список ролей, которые дают доступ к объектам.
Код: plaintext
1.
2.
3.
 №    Объект  Имя поля	Значение 
3    VKO     ACTVT      1
3    VKS     ACTVT	1

Согласно логике работы системы, пользователь получит доступ к данным: если из таблицы Контроли ему будет выдана роль, в которую входят оба объета: VKO и VKS. Т.е. если пользователю будет выдана роль LOG из таблицы Роли, то доступ к данным он получит, а если будет выдана роль EOSP, то доступа не будет, так как это роль дает доступ только к одному объекту: VKO.

Вопрос заключается в том, как соединить таблицы, чтобы роль EOSP не выводилась в результирующий список, так как она не дает доступ к данным. Возможно соединить результирующую таблицу саму на себя по названию роли и добавить условие, что объект<>объект_1, но это частное решение задачи, потому что возможны ситуации, когда доступ управляется больше чем двумя объектами.

Буду очень благодарен за совет.
Спасибо.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39631993
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GROUP BY роль
HAVING COUNT(DISTINCT объект)=2
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632153
mnbvcx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaGROUP BY роль
HAVING COUNT(DISTINCT объект)=2
Count (distinct ) access не поддерживает.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632158
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mnbvcx , ну так я и пишу не запрос, а идею реализации. Как уж она там будет реализована - подзапросом, пользовательской функцией или ещё как,- дело десятое.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632180
gul.dima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaGROUP BY роль
HAVING COUNT(DISTINCT объект)=2

Спасибо, но это тоже частный случай решения задачи, когда доступ к данным управляется двумя объектами.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632205
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gul.dima,

то, что ты хочешь получить, называется "Реляционное деление"
Такое, вроде бы, в Акцессе должно сработать
@t1 - твоя таб.Роли , @t2 - таблица Контроли
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @t1 table (Роль	varchar(10), Объект	varchar(10), [Имя поля] varchar(10), Значение int)

insert into @t1 values
('EOSP',	'VKO',	'ACTVT',     1)
,('LOG',	'VKO',	'ACTVT',	  1)
,('LOG',	'VKS',	'ACTVT',	  1)

declare @t2 table ([№] int,   Объект varchar(10), [Имя поля] varchar(10), Значение int)

insert into @t2 values
(3,    'VKO',     'ACTVT',      1)
,(3,    'VKS',     'ACTVT',      1)


Код: sql
1.
2.
3.
4.
5.
--	Result
select distinct t.Роль from @t1 t
where not exists 
		(select * from @t2 t2 left join @t1 t1 on t1.Объект=t2.Объект and t1.[Имя поля]=t2.[Имя поля] and t1.Значение=t2.Значение and t1.Роль=t.Роль
		where t1.Роль is null)  
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632609
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gul.dimaэто тоже частный случай решения задачи, когда доступ к данным управляется двумя объектами.Ну так и двойка там не догма... как бы.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632623
gul.dima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо, за комментарий, согласен, что 2 это не догма. Но, думаю, count в данном случае не подходит. На том объеме данных, что я разместил в качестве примера, этого не видно. Но допустим такую ситуацию, когда роль EOSP тоже дает доступ к двум объектам: к VKO и VK X .
Код: plaintext
1.
2.
3.
4.
5.
Роль	Объект	Имя поля Значение
EOSP	VKO	ACTVT     1
EOSP	VKX	ACTVT     1
LOG	VKO	ACTVT	  1
LOG	VKS	ACTVT	  1
В таком случае count для роли EOSP=2 и роль EOSP попадет в результат. Поправьте, если я не прав.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632626
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gul.dimaВ таком случае count для роли EOSP=2А то, что ДО ГРУППИРОВКИ там ещё какое-то WHERE должно быть - не? После него двух-то не останется...
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632627
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще - почитали бы Вы теорию про EAV и типовые операции с ею...
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632633
gul.dima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Отличное решение, спасибо большое! Но, к сожалению, в Access не работает, выдает ошибку в части:
Код: plaintext
1.
2.
3.
 [code=sql]
select * from @t2 t2 left join @t1 t1 on t1.Объект=t2.Объект and t1.[Имя поля]=t2.[Имя поля] and t1.Значение=t2.Значение and t1.Роль=t.Роль
		where t1.Роль is null

Мне кажется, что он ругается на условие соединения таблиц t1.Роль=t.Роль. Но теперь я буду знать, что гуглить надо "Реляционное деление".
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632637
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 .. ) - то, в Аксе, будет не просто ...
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632652
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gul.dimaМне кажется, что он ругается на условие соединения таблиц t1.Роль=t.РольЯсен пень - у тебя в источнике данных нет таблицы t .
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632664
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinagul.dimaМне кажется, что он ругается на условие соединения таблиц t1.Роль=t.РольЯсен пень - у тебя в источнике данных нет таблицы t .Нее, там в самом деле что-то Акцесса такое условие не принимает ...
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632668
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ааа... так это коррелированный подзапрос? да, обломись. Перепиши на обычный JOIN.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39632733
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gul.dimaНо, к сожалению, в Access не работаетВот так Акцесс "принял"
Код: sql
1.
2.
3.
4.
5.
select distinct t1.Роль from Роли t1
where not exists	
	(select * from Контроли t2 
	where 1 not in (select 1 from Роли t11 
			where t1.Роль=t11.Роль and t11.Объект=t2.Объект and t11.[Имя поля]=t2.[Имя поля] and t11.Значение=t2.Значение))
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39633299
gul.dima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Спасибо большое, вы очень помогли! Правда Access не справился с 300 тыс. строками, хотя я оставил запрос часа на три. Видимо нужно переходить на другую СУБД, несмотря на то, что интеграция с Excel и привычный графический редактор запросов подкупают.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39633308
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gul.dimaAccess не справился с 300 тыс. строками, хотя я оставил запрос часа на три. 
Видимо, из-за
Код: sql
1.
....not in....
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39633329
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если правильно понимаю.
Код: sql
1.
2.
3.
4.
SELECT Роль FROM
(SELECT Роль FROM Роли INNER JOIN Контроли On ....)
GROUP BY Роль
HAVING Count(*)=DCount("*","Контроли")


Но, может, и глупость.
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39633538
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Michellegul.dimaAccess не справился с 300 тыс. строками, хотя я оставил запрос часа на три. 
Видимо, из-за
Код: sql
1.
....not in....

Да, это можно нужно заменить на not exists
Код: sql
1.
2.
3.
4.
5.
select distinct t1.Роль from Роли t1
where not exists	
	(select * from Контроли t2 
	where not exists (select 1 from Роли t11 
			where t1.Роль=t11.Роль and t11.Объект=t2.Объект and t11.[Имя поля]=t2.[Имя поля] and t11.Значение=t2.Значение))
...
Рейтинг: 0 / 0
Соединение двух таблиц при выполнении двух и более условий
    #39633549
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gul.dimacourt,

Спасибо большое, вы очень помогли! Правда Access не справился с 300 тыс. строками, хотя я оставил запрос часа на три. Видимо нужно переходить на другую СУБД, несмотря на то, что интеграция с Excel и привычный графический редактор запросов подкупают.
В Контроли, объект всегда уникальный ?
Т.е. не может быть такой ситуации :
Код: plaintext
1.
2.
3.
4.
 №    Объект  Имя поля	Значение 
3    VKO     ACTVT      1
3    VKS     ACTVT	1
3     VKS       ACTVT2 	1

?

Если ответ "Да", то эту часть из запроса можно удалить
Код: sql
1.
2.
3.
4.
5.
select distinct t1.Роль from Роли t1
where not exists	
	(select * from Контроли t2 
	where 1 not in (select 1 from Роли t11 
			where t1.Роль=t11.Роль and t11.Объект=t2.Объект and t11.[Имя поля]=t2.[Имя поля] and t11.Значение=t2.Значение))


...нуу и + индексы
полюбому нужен индекс на Роль в таб.Роли
Если ответ на вопрос выше "Нет" - ещё индексы на {Объект,Имя поля} в Роли и такой же в Контроли
(поле "Значение", я так понял, битовое, на него не нужно)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Соединение двух таблиц при выполнении двух и более условий
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]