Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

A ver quién sabe? Consulta con exclusiones

Estas en el tema de A ver quién sabe? Consulta con exclusiones en el foro de Mysql en Foros del Web. Después de buscar por Internet y por el foro no he logrado dar con na solución al problema que se me acaba de presentar y ...
  #1 (permalink)  
Antiguo 02/05/2007, 08:36
Avatar de SeriketZu  
Fecha de Ingreso: septiembre-2006
Ubicación: Mendoza, Argentina
Mensajes: 78
Antigüedad: 17 años, 7 meses
Puntos: 0
Pregunta A ver quién sabe? Consulta con exclusiones

Después de buscar por Internet y por el foro no he logrado dar con na solución al problema que se me acaba de presentar y que les paso a contar:
Código:
Tabla: Maquinas
Id [smallint]
Nombre [varchar(30)]
Descripcion [varchar(200)]
Estado [boolean]

Tabla: Partes
Id [smallint]
Nombre [varchar(30)]
Descripcion [varchar(200)]
Estado [boolean]

Tabla: Maquina_Parte
IdMaquina [smallint]
IdParte [smallint]
Cuando se asocia una Parte a una Máquina, se inserta un nuevo registro en esta última tabla, pero no hay registros de Partes que no están asociadas a una Máquina.


La pregunta sería qué consulta/s debería hacer para guardar en un Store Procedure en el que le envíe IdMáquina y me devuelva todas las Partes existentes que no están asociadas a esa Máquina (no importa si las partes están asociadas a otras Máquinas, si no están asociadas a la elegida, deben figurar como no asociadas tambíen).

Por si no se entendió, un ejemplo:
Código:
Tabla Partes (Id, Nombre, Descripción, Estado):
1, Parte1, Desc1, 1
2, Parte2, Desc2, 1
3, Parte3, Desc3, 1
4, Parte4, Desc4, 0

Tabla Maquinas (Id, Nombre, Descripción, Estado):
1, Maq1, Descr1, 1
2, Maq2, Descr2, 1
3, Maq3, Descr3, 1

Tabla Maquina_Parte (IdMaquina, IdParte):
1,1
1,3
2,2
2,3
Para obtener las Partes asociadas a una Máquina utilizo:
Código:
Select Id,Nombre,Descripcion,Estado
From Partes Inner Join Maquina_Parte
On Partes.Id = Maquina_Parte.IdParte
Where Maquina_Parte.IdMaquina = 1;
Que da como resultado:
Código:
Id, Nombre, Descripcion, Estado
1, Parte1, Desc1, 1
3, Parte3, Dessc3, 1
El problema es cuando quiero obtener todas las Partes que NO están asociadas a esa Máquina. Por ejemplo, si quiero conocer todas las Partes que no están asociadas a la Máquina cuyo Id=1 me debería devolver:
Código:
Id, Nombre, Descripcion, Estado
2, Parte2, Desc2, 1
4, Parte4, Dessc4, 0
He probado con lo siguiente sin éxito:
Código:
Select Id,Nombre,Descripcion,Estado
From Partes Left Join Maquina_Parte
On Partes.Id = Maquina_Parte.IdParte
Where Maquina_Parte.IdMaquina is NULL;
Devuelve:
Código:
Id, Nombre, Descripcion, Estado
4, Parte4, Desc4, 0
Y no devuelve la Parte con Id=2 debido a que esa Parte está asociada a otra Máquina (como verán una Parte puede estar asociada a varias Máquinas). Por lo tanto probé con esto:
Código:
Select Id,Nombre,Descripcion,Estado
From Partes Left Join Maquina_Parte
On Partes.Id = Maquina_Parte.IdParte
Where Maquina_Parte.IdMaquina is NULL
Or Maquina_Parte.IdMaquina!=1
And Maquina_Parte.IdParte!=(Select IdParte From Maquina_Parte Where IdMaquina=1);
Pero obtengo el siguiente error (funciona bien si el segudo Select devuelve un sólo registro, pero si develve más de un registro da el error):
Código:
Error Code : 1242
Subquery returns more than 1 row
(0 ms taken)

Bueno creo que quedó bastante claro el problema, yo pensé que existía una palabra clave que permitía excluir registros del resultado pero buscando en Internet no lo he encontrado, asi que espero que alguien pueda ayudarme a solucionar esto.

Gracias, saludos!
  #2 (permalink)  
Antiguo 03/05/2007, 13:16
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 5 meses
Puntos: 11
Re: A ver quién sabe? Consulta con exclusiones

no te sirver hacer:

select * from maquina_parte where idmaquina<>algun_id_maquina
  #3 (permalink)  
Antiguo 04/05/2007, 07:12
Avatar de SeriketZu  
Fecha de Ingreso: septiembre-2006
Ubicación: Mendoza, Argentina
Mensajes: 78
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: A ver quién sabe? Consulta con exclusiones

No me sirve, porque si hay una parte asociada a más de una máquina, al ejecutar esta sentencia aparecería en el listado de las partes no asociadas a la máquina y otras partes que no estén asociadas a ninguna máquina no aparecerían.
Graicas, saludos.
  #4 (permalink)  
Antiguo 04/05/2007, 07:35
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Re: A ver quién sabe? Consulta con exclusiones

Buenas creo que esto te va a servir:

SELECT Partes.Id FROM Partes,Maquina_Parte WHERE Partes.Id!=Maquina_Parte.IdParte AND Maquina_Parte.IdMaquina==2
El ejemplo es para un idmaquina de maquina igual a 2.
Saludos!!!:
__________________
->Aprender es un proceso que incluye el error..
  #5 (permalink)  
Antiguo 11/05/2007, 06:05
Avatar de SeriketZu  
Fecha de Ingreso: septiembre-2006
Ubicación: Mendoza, Argentina
Mensajes: 78
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: A ver quién sabe? Consulta con exclusiones

Era buena la idea pero me muestra campos repetidos (con los que no hay problema, se soluciona con un DISTINCT), pero también me muestra partes que si están relacionadas con la máquina
Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:24.