组合2个查询 - 将列名称合并为一个,并在另一个查询中使用结果

Zyg*_*ygD 6 sql ms-access select

构建我的第一个Microsoft Access SQL查询.那不应该这么难!
我有2张桌子:

数据表 AccessRights表

属于GroupA登录的用户.我只想向他显示分配给的Data表行和列GroupA,如下所示:

+--------+--------+--------+
| Group  |  Data3 | Data4  |
+--------+--------+--------+
| GroupA |   9    |   4    | 
| GroupA |   1    |   5    |
+--------+--------+--------+
Run Code Online (Sandbox Code Playgroud)

我试过这个愚蠢的选择:

SELECT (select Data from AccessRights where GroupA = "y")
FROM Data
WHERE Data.Group = "GroupA";
Run Code Online (Sandbox Code Playgroud)

shA*_*A.t 3

我使用这个查询:

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");
Run Code Online (Sandbox Code Playgroud)

对于这个结果:

Group   | Data_1 | Data_2 | Data_3 | Data_4
--------+--------+--------+--------+--------
GroupA  |        |        | 9      | 4
GroupA  |        |        | 1      | 5
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

例如; myQuery("GroupA")

SELECT [DATA].[Group],Data3,Data4 FROM [Data] WHERE ((Data.[Group])="GroupA")
Run Code Online (Sandbox Code Playgroud)