Объединение 2 запросов-получение имен столбцов в одном и использование результатов в другом запросе

создание моих первых SQL-запросов Microsoft Access. Это не должно быть так сложно!
У меня есть 2 таблицы:

Data tableAccessRights table

пользователь, принадлежащий 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    |
+--------+--------+--------+