unir tablas tabla relacionadas misma inner ejemplos consultas consultar consulta complejas sql ms-access select

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