Maximo entre dos tablas relacionadas |
Responder | Página 12> |
Autor | |
shenares
Habitual Unido: 01/Septiembre/2020 Localización: Madrid Estado: Sin conexión Puntos: 62 |
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 |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
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
|
|
shenares
Habitual Unido: 01/Septiembre/2020 Localización: Madrid Estado: Sin conexión Puntos: 62 |
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 |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
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
|
|
shenares
Habitual Unido: 01/Septiembre/2020 Localización: Madrid Estado: Sin conexión Puntos: 62 |
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, |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
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 |
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
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 |
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
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
|
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
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.
|
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
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
|
|
shenares
Habitual Unido: 01/Septiembre/2020 Localización: Madrid Estado: Sin conexión Puntos: 62 |
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, |
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
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. |
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
Enviado: 02/Septiembre/2020 a las 21:51 |
Devices Rayos, desde el mobil...
|
|
shenares
Habitual Unido: 01/Septiembre/2020 Localización: Madrid Estado: Sin conexión Puntos: 62 |
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, |
|
shenares
Habitual Unido: 01/Septiembre/2020 Localización: Madrid Estado: Sin conexión Puntos: 62 |
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, |
|
Responder | Página 12> |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |