Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/05/2007, 08:36
Avatar de SeriketZu
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!