Объединение 2 запросов-получение имен столбцов в одном и использование результатов в другом запросе
создание моих первых SQL-запросов Microsoft Access. Это не должно быть так сложно!
У меня есть 2 таблицы:
пользователь, принадлежащий GroupA
вход в систему. Я хочу показать ему только те Data
таблицы строк и столбцов, которые GroupA
присваивается, например:
+--------+--------+--------+
| Group | Data3 | Data4 |
+--------+--------+--------+
| GroupA | 9 | 4 |
| GroupA | 1 | 5 |
+--------+--------+--------+
я попробовал этот глупый вариант:
SELECT (select Data from AccessRights where GroupA = "y")
FROM Data
WHERE Data.Group = "GroupA";
4 ответов
Я использую этот запрос:
SELECT
Data.[Group],
IIf((SELECT GroupA FROM AccessRights WHERE Data = "Data1")="y",[Data1],Null) AS Data_1,
IIf((SELECT GroupA FROM AccessRights WHERE Data = "Data2")="y",[Data2],Null) AS Data_2,
IIf((SELECT GroupA FROM AccessRights WHERE Data = "Data3")="y",[Data3],Null) AS Data_3,
IIf((SELECT GroupA FROM AccessRights WHERE Data = "Data4")="y",[Data4],Null) AS Data_4
FROM
Data
WHERE
((Data.[Group])="GroupA");
для этого результата:
Group | Data_1 | Data_2 | Data_3 | Data_4
--------+--------+--------+--------+--------
GroupA | | | 9 | 4
GroupA | | | 1 | 5
Я просто скрываю значения Data1
и Data2
.
если вы действительно хотите скрыть свои столбцы, вам нужно использовать VBA, что я создаю функцию VBA, которая даст вашу окончательную строку запроса на основе вашей группы:
Function myQuery(groupName As String) As String
Dim strResult As String
Dim rs As Recordset
Dim i As Integer
strResult = "SELECT [DATA].[Group]"
Set rs = CurrentDb.OpenRecordset("SELECT [Data], [" & groupName & "] FROM AccessRights WHERE [" & groupName & "] = ""y""")
For i = 0 To rs.RecordCount
strResult = strResult & "," & rs.Fields("Data").Value
rs.MoveNext
Next i
strResult = strResult & " FROM [Data] WHERE ((Data.[Group])=""" & groupName & """)"
myQuery = strResult
End Function
например:myQuery("GroupA")
будет
SELECT [DATA].[Group],Data3,Data4 FROM [Data] WHERE ((Data.[Group])="GroupA")
вероятно, было бы лучше просто повернуть таблицу данных и добавить столбец с именем data. Сделайте то же самое для прав доступа.
вы таблица данных будет выглядеть примерно так:
Group, Data, Value
Groupa,Data1,1
Groupb,Data2,7
...
AccessRights такой:
Data, Group, Valid
Data1, GroupA, Y
Data2, GroupA, N
тогда вы можете просто объединить две таблицы вместе и фильтровать по мере необходимости.
Select *
FROM Data D
JOIN AccessRights A
on D.data = A.data and D.Group = A.Group
WHERE A.Valid = 'Y'
and D.Group = 'GroupA'
@ZygD, вот схема:
USER
user_id int primary key auto_increment
user_name varchar(100)
password varchar(100)
GROUP
group_id int primary key auto_increment
group_name varchar(100)
DATA
data_id int primary key auto_increment
data_name varchar(100)
USER_GROUP
user_id int
group_id int
GROUP_DATA
group_id
data_id
я объясню. Сначала вы определяете свои "типы объектов". У вас есть пользователь, группа и то, что вы назвали данными. В стороне, вероятно, хорошая идея использовать другое слово вместо данных. Используйте что-то вроде ITEM или даже DATAITEM. Для этого примера я буду использовать DATA. Итак, каждая из этих таблиц имеет целочисленное значение как первичный ключ. Первичный ключ является уникальным идентификатором записи в таблице и автоматически увеличивается. Вы может в Доступ.
теперь, когда у вас есть три таблицы типов объектов, вам нужно то, что называется "объединить таблицы", чтобы описать отношения между таблицами "тип объекта". В таблице USER_GROUP указано, что пользователь может принадлежать к одной или нескольким группам. Например, если пользователь 1 принадлежал как к группе 1, так и к группе 2, в таблице USER_GROUP у вас будет две записи для описания этих отношений. Первая строка будет 1,1, а вторая - 1,2.
таблица GROUP_DATA описывает связь между группой и данными. Например, группа 1 может иметь доступ к данным 2 и данным 3. Опять же, у вас будет две строки в таблице GROUP_DATA для описания этих отношений. Первая строка будет 1,2, а вторая-1,3.
теперь, поскольку пользователь 1 принадлежит к группе 1, пользователь 1 будет иметь доступ к данным 2 и 3. Затем ваш SQL упрощается:
// Authenticate the user with user_name and password:
select @user_id = a.user_id from user a where a.user_name = @user_name and a.password = @password
// Get DATA by user_id
select c.data_id, c.data_name from user a join group b on a.user_id = b.user_id join data c on b.data_id = c.data_id where a.user_id = @user_id
Ok наконец, вот результат, который вам нужен. Хорошая вещь с этим решением заключается в том, что вам не нужно запускать дополнительный скрипт, а также просто передать имя группы в качестве параметра, и он вернет только нужные столбцы. Наслаждаться. :)
declare @aa varchar (200) = ''
declare @sql varchar(500) = ''
declare @groupinfo varchar(100) = 'GroupA'
Select @aa = coalesce (case when @aa = '' then Data else @aa + ',' + Data end ,'')
from [AccessRights] where GroupA = 'y'
Set @sql = 'Select [Group],' + @aa + ' from Data where [Group] = ' + '''' + @groupinfo + ''''
Exec(@sql)
+--------+--------+--------+
| Group | Data3 | Data4 |
+--------+--------+--------+
| GroupA | 9 | 4 |
| GroupA | 1 | 5 |
+--------+--------+--------+