tablas - unir dos consultas sql misma tabla
Combinación de 2 consultas: obtención de nombres de columnas en una y uso de resultados en otra consulta (4)
Probablemente sería mejor simplemente girar su tabla de datos y agregar una columna llamada datos. Haz lo mismo para los derechos de acceso.
Tu tabla de datos se vería así:
Group, Data, Value
Groupa,Data1,1
Groupb,Data2,7
...
AccessRights como este:
Data, Group, Valid
Data1, GroupA, Y
Data2, GroupA, N
Luego, puede unir las dos tablas y filtrar según sea necesario.
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''
Construyendo mis primeras consultas SQL de Microsoft Access. ¡Eso no debería ser tan difícil!
Tengo 2 tablas:
Un usuario que pertenece al GroupA
A GroupA
sesión. Quiero mostrarle solo aquellas filas y columnas de la tabla de Data
las que se asigna GroupA
, como esta:
+--------+--------+--------+
| Group | Data3 | Data4 |
+--------+--------+--------+
| GroupA | 9 | 4 |
| GroupA | 1 | 5 |
+--------+--------+--------+
Intenté esta opción tonta:
SELECT (select Data from AccessRights where GroupA = "y")
FROM Data
WHERE Data.Group = "GroupA";
Yo uso esta consulta:
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");
Por este resultado:
Group | Data_1 | Data_2 | Data_3 | Data_4
--------+--------+--------+--------+--------
GroupA | | | 9 | 4
GroupA | | | 1 | 5
Solo oculto los valores de Data1
y Data2
.
Si realmente quiere ocultar sus columnas, necesita usar VBA para crear una función VBA que le dé la cadena de consulta final en función de su grupo:
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
Por ejemplo; myQuery("GroupA")
será
SELECT [DATA].[Group],Data3,Data4 FROM [Data] WHERE ((Data.[Group])="GroupA")
Ok, aquí está el resultado que necesitabas. Lo bueno de esta solución es que no necesita ejecutar secuencias de comandos adicionales y simplemente pasar el nombre del grupo como parámetro y devolverá solo las columnas que necesita. Disfrutar. :)
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 |
+--------+--------+--------+
@ZygD, aquí está el esquema:
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
Lo explicaré. Primero defines tus "tipos de objetos". Usted tiene un USUARIO, GRUPO y lo que usted ha llamado DATOS. Aparte, probablemente sea una buena idea usar otra palabra en lugar de DATA. Use algo como ITEM o incluso DATAITEM. Para este ejemplo usaré DATA. Ok, entonces cada una de estas tablas tiene un valor entero ya que es la clave principal. La clave principal es el identificador único para el registro en la tabla y se incrementa automáticamente. Puede configurar eso en Access.
Ahora que tiene sus tres tablas de tipo de objeto, necesita lo que se denomina "tablas de combinación" para describir las relaciones entre las tablas de "tipo de objeto". La tabla USER_GROUP dice que un usuario puede pertenecer a uno o más grupos. Por ejemplo, si el Usuario 1 pertenecía tanto al Grupo 1 como al Grupo 2, entonces tendría dos registros en la tabla USER_GROUP para describir esas relaciones. La primera fila sería 1,1 y la segunda fila sería 1,2.
La tabla GROUP_DATA describe la relación entre GROUP y DATA. Por ejemplo, el Grupo 1 podría tener acceso a Datos 2 y Datos 3. De nuevo, tendría dos filas en la tabla DATOS_Grupos para describir esas relaciones. La primera fila sería 1,2 y la segunda sería 1,3.
Ahora, dado que el Usuario 1 pertenece al Grupo 1, entonces el Usuario 1 tendrá acceso a los Datos 2 y 3. Su SQL se simplificará:
// 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