une - union sql




Combinaison de 2 requêtes-obtention de noms de colonnes en un et utilisation des résultats dans une autre requête (3)

Il serait probablement préférable de simplement faire pivoter votre table de données et d'ajouter une colonne nommée data. Faites de même pour les droits d'accès.

Votre table de données ressemblerait à ceci:

Group, Data, Value
Groupa,Data1,1
Groupb,Data2,7
...

AccessRights aime ceci:

Data, Group, Valid
Data1, GroupA, Y
Data2, GroupA, N

Ensuite, vous pouvez simplement joindre les deux tables ensemble et filtrer au besoin.

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'

Construire mes premières requêtes SQL Microsoft Access. Ça ne devrait pas être si dur!
J'ai 2 tables:

Un utilisateur appartenant à GroupA connecté. Je souhaite lui montrer uniquement les lignes et colonnes du tableau de Data auxquelles GroupA est affecté, comme ceci:

+--------+--------+--------+
| Group  |  Data3 | Data4  |
+--------+--------+--------+
| GroupA |   9    |   4    | 
| GroupA |   1    |   5    |
+--------+--------+--------+

J'ai essayé cette option stupide:

SELECT (select Data from AccessRights where GroupA = "y")
FROM Data
WHERE Data.Group = "GroupA";

J'utilise cette requête:

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");

Pour ce résultat:

Group   | Data_1 | Data_2 | Data_3 | Data_4
--------+--------+--------+--------+--------
GroupA  |        |        | 9      | 4
GroupA  |        |        | 1      | 5

Je cache simplement les valeurs de Data1 et Data2 .

Si vous voulez vraiment cacher vos colonnes, vous devez utiliser VBA pour créer une fonction VBA qui donnera votre chaîne de requête finale basée sur votre groupe:

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

Par exemple; myQuery("GroupA") sera

SELECT [DATA].[Group],Data3,Data4 FROM [Data] WHERE ((Data.[Group])="GroupA")

@ZygD, voici le schéma:

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

Je vais t'expliquer. Vous définissez d'abord vos "types d'objet". Vous avez un USER, GROUP et ce que vous avez appelé DATA. À part cela, c'est probablement une bonne idée d'utiliser un autre mot au lieu de DATA. Utilisez quelque chose comme ITEM, ou même DATAITEM. Pour cet exemple, j'utiliserai DATA. Ok, donc chacune de ces tables a une valeur entière comme clé primaire. La clé primaire est l'identifiant unique de l'enregistrement dans la table et elle s'incrémente automatiquement. Vous pouvez le configurer dans Access.

Maintenant que vous avez vos trois tables de types d'objets, vous avez besoin de ce que l'on appelle des "tables de jointure" pour décrire les relations entre les tables "type d'objet". La table USER_GROUP indique qu'un utilisateur peut appartenir à un ou plusieurs groupes. Par exemple, si l'utilisateur 1 appartenait à la fois au groupe 1 et au groupe 2, vous auriez deux enregistrements dans la table USER_GROUP pour décrire ces relations. La première rangée serait 1,1 et la deuxième rangée serait 1,2.

La table GROUP_DATA décrit la relation entre GROUP et DATA. Par exemple, le groupe 1 pourrait avoir accès à Data 2 et Data 3. Une fois de plus, vous auriez deux lignes dans la table GROUP_DATA pour décrire ces relations. La première rangée serait 1,2 et la seconde serait 1,3.

Maintenant, parce que l'utilisateur 1 appartient au groupe 1, l'utilisateur 1 aura accès aux données 2 et 3. Votre SQL devient alors simplifié:

// 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




select