** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Maximo entre dos tablas relacionadas
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoMaximo entre dos tablas relacionadas

 Responder Responder Página  12>
Autor
Mensaje
shenares Ver desplegable
Nuevo
Nuevo


Unido: 01/Septiembre/2020
Localización: Madrid
Estado: Sin conexión
Puntos: 23
Enlace directo a este mensaje Tema: Maximo entre dos tablas relacionadas
    Enviado: 01/Septiembre/2020 a las 12:54
Hola a todos,

Este es mi primer post en este foro y espero que podáis ayudarme con el siguiente problema.

Tengo una base de datos que relaciona el estado de dispositivos (tabla DeviceStatus) y la información del dispositivo (tabla Devices). Estoy intentando realizar una consulta que me muestre el ultimo estado de cada dispositivo.

Las dos tablas estan relacionadas entre sí por Devices.Model = DeviceStatus.DeviceModel.

La consulta que muestra los datos de las dos tablas es la siguiente:

SELECT Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Id, DeviceStatus.Status, Devices.Criticity, Devices.PIlot
FROM DeviceStatus INNER JOIN Devices ON DeviceStatus.DeviceModel = Devices.Model;


Lo que me gustaría obtener es SOLO el ultimo estado (coincide con el valor Maximo de ID) de cada dispositivo. He intentado de muchas formas pero no soy capaz de realizar esta configuración.

¿Pueden ayudarme?

Un saludo y gracias de antemano.

Editado por shenares - 01/Septiembre/2020 a las 13:05
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: en línea
Puntos: 13125
Enlace directo a este mensaje Enviado: 01/Septiembre/2020 a las 15:43
Hola shenares y bienvenido al foro,

Yo tendría una consulta de agrupación sobre la tabla DeviceStatus agrupando por DeviceModel y Status y tomando el Max de ID.

Esa consulta es la que vincularía con la tabla Devices por Model <-> DeviceModel.

Prueba y nos cuentas.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
shenares Ver desplegable
Nuevo
Nuevo


Unido: 01/Septiembre/2020
Localización: Madrid
Estado: Sin conexión
Puntos: 23
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 08:48
Hola Xavi,

Muchas gracias por la contestación.

Realizando lo que me cuentas, Access me da error en el MAX(DeviceStatus.Id):

SELECT Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Status, Devices.Criticity, Devices.PIlot, DeviceStatus.Id
FROM DeviceStatus INNER JOIN Devices ON DeviceStatus.DeviceModel = Devices.Model
Group by DevidceStatus.DeviceModel, DeviceStatus.Status, Max(DeviceStatus.Id);

El error que me da es el siguiente:

"No puede haber una funcion de agregado en la cláusula GROUP BY (Max(DeviceStatus.Id)).

¿Que estoy haciendo mal?

Un saludo
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: en línea
Puntos: 13125
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 13:37
No parece que hayas hecho lo que te digo. Me parece que te has limitado a CONVERTIR tu consulta en una consulta de totales.

Debes hacer una consulta NUEVA sobre DeviceStatus.

Esa consulta NUEVA debe sustituir a la tabla DeviceStatus en TU consulta.


Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
shenares Ver desplegable
Nuevo
Nuevo


Unido: 01/Septiembre/2020
Localización: Madrid
Estado: Sin conexión
Puntos: 23
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 13:47
Hola,

Vale, entiendo que sería algo así:

SELECT Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Id, DeviceStatus.Status, Devices.Criticity, Devices.PIlot
FROM DeviceStatus INNER JOIN
(
SELECT DeviceModel, Status, Max(Id)
FROM DeviceStatus
Group by DeviceModel, Status
)
Devices ON DeviceStatus.DeviceModel = Devices.Model;

El problema es que al ejecutarla me pide ingresar un valor para Devices.Id.

¿Que hago mal?

Un saludo,
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: en línea
Puntos: 13125
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 14:30
Vamos a ver...

Crea una consulta NUEVA. Añades la tabla DevicesStatus. La conviertes en consulta de totales. Agrupart por DeviceModel y Status. Maximo de Id. Guarda la consula como qryStatusDevices

Crea otra consulta. Añades la tabla Devices y la consulta qryStatusDevices. Las relacionas. Decides los campos que mostrarás. 

Pruebas y nos cuentas el resultado


Xavi, un minyó de Terrassa

Mi web
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3233
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 15:07
Algo asi funciona. No puedo probarla porque no tengo esas tablas, pero probando con una estructura de tablas uno a varios en mi lado, me funciona:
SELECT Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Id, DeviceStatus.Status, Devices.Criticity, Devices.PIlot
FROM DeviceStatus AS Device INNER JOIN
(
SELECT DeviceModel, Max(Id) as MaxId
FROM DeviceStatus
Group by DeviceModel
) as Status
where Device.id = Status.DeviceModel
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3233
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 15:10
Reemplaza DeviceStatus.Id por Status.MaxId y corrije en (la sql que yo pegue aqui) en WHERE DeviceS.id
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3233
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 15:25
Las funciones de agregado no rinden cuando el volumen de información es grande.
Otras bases de datos relacionales permiten hacer esta consulta sin necesidad de ellas. Sinceramente, ignoro si se puede hacer con mdbs.
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3233
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 15:37
SELECT Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Id, Status.MaxId, Devices.Criticity, Devices.PIlot
FROM DeviceStatus Devices,
(SELECT DeviceModel, Max(Id) as MaxId
FROM DeviceStatus
Group by DeviceModel) Status
where Devices.id = Status.DeviceModel
Arriba
shenares Ver desplegable
Nuevo
Nuevo


Unido: 01/Septiembre/2020
Localización: Madrid
Estado: Sin conexión
Puntos: 23
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 17:40
Hola Guarracuco,

Gracias por la ayuda.

Al ejecutar esta sentencia Access devuelve un error indicando que no coinciden los tipos. Viendo la sentencia he visto el WHERE erroneo, ya que la relación entre las dos tablas es Devices.Model = DeviceStatus.DeviceModel. Al corregir esto como lo siguiente:

SELECT Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Id, Status.MaxId, Devices.Criticity, Devices.PIlot
FROM DeviceStatus Devices,
(SELECT DeviceModel, Max(Id) as MaxId
FROM DeviceStatus
Group by DeviceModel) Status
where Devices.Model = Status.DeviceModel;

Access me muestra un pop-up para introducir los valores del primer SELECT (Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Id, Status.MaxId, Devices.Criticity, Devices.PIlot)

Un saludo,
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3233
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 21:50
Modifica lo siguiente en el primer FROM
FROM DeveiceStatus por FROM Deveices.

Si pregunta por parámetros, es porque el origen no se encuentra.

Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3233
Enlace directo a este mensaje Enviado: 02/Septiembre/2020 a las 21:51
Devices
Rayos, desde el mobil...Embarrassed
Arriba
shenares Ver desplegable
Nuevo
Nuevo


Unido: 01/Septiembre/2020
Localización: Madrid
Estado: Sin conexión
Puntos: 23
Enlace directo a este mensaje Enviado: 03/Septiembre/2020 a las 08:50
Hola Guarracuco,

En la sentencia estan incluidas las 2 tablas en el primer FROM

SELECT Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Id, Status.MaxId, Devices.Criticity, Devices.PIlot
FROM Devices DeviceStatus,

Aún así, me sigue pidiendo los datos con esta sentencia.

No se que puedo estar haciendo mal...

Un saludo,
Arriba
shenares Ver desplegable
Nuevo
Nuevo


Unido: 01/Septiembre/2020
Localización: Madrid
Estado: Sin conexión
Puntos: 23
Enlace directo a este mensaje Enviado: 03/Septiembre/2020 a las 09:41
Hola,

Ya lo he solucionado. El problema es que le faltaba una coma. Aquí esta la sentencia:

SELECT Devices.Id, Devices.Manufacturer, Devices.Model, DeviceStatus.Id, Status.MaxId, Devices.Criticity, Devices.PIlot
FROM Devices, DeviceStatus, (SELECT DeviceModel, Max(Id) AS MaxId FROM DeviceStatus GROUP BY DeviceModel) AS Status
WHERE Devices.Model = Status.DeviceModel;


Muchisimas gracias por la ayuda!

Un saludo,
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable