Subconsulta en sql 2000

Quiero realizar una subconsulta en sql en donde tengo cuatro tablas una llamada Puesto que tiene IdPuesto, NombrePuesto. La segunda tabla se llama Unidad que tiene IdUnidad, NombreUnidad, Ubicación. La tercera se llama Área que tiene IdArea, IdUnidad, NombreArea y la cuarta la principal es Responsable que tiene los campos de IdResponsable, IdPuesto, IdArea, Nombre, ApellidoP, ApellidoM.
La subconsulta que quiero hacer es que me muestre la lista de todos los responsables con sus respectivo puesto, la área a la que pertenece y la unidad dado que existen los mismos nombres de áreas en cada unidad
la subconsulta que yo tengo es
Select Nombre,ApellidoPaterno,ApellidoMterno,NombrePuesto,NombreUnidad,NombreArea,Ubicacion from Responsable,Area,Puesto,Unidad where Responsable.IdResponsable = Area.IdArea and Unidad.IdUnidad = area.IdUnidad and Responsable.IdResponsable= Puesto.IdPuesto
pero solo me muestra los responsables que tienen tanto el idResponsable y el Idarea iguales y los demás no me los muestra. Quisiera sabe como seria la consulta para que me muestre todos los responsables no unos cuantos. Y si esa misma consulta tengo que utilizar para insertar registros?.

1 respuesta

Respuesta
1
Como clave foránea, el campo IdArea de la tabla Responsable, sólo debería tener valores del campo IdArea de la tabla Área.
Vamos por partes, primero te muestro cómo hacer tu construcción utilizando INNER JOIN y en función de lo que me cuentas vamos a utilizar LEFT JOIN para subsanar los problemas que tienes.
Esta es tu consulta utilizando INNER JOIN en lugar de un producto cartesiano que es lo que estás haciendo:
SELECT R.Nombre,
R.ApellidoP,
R.ApellidoM,
P.NombrePuesto,
U.NombreUnidad,
U.Ubicación,
A.NombreArea
FROM Responsable R
 INNER JOIN Puesto P ON P.IdPuesto=R.IdPuesto
 INNER JOIN Area A ON A.IdArea=R.IdArea
 INNER JOIN Unidad U ON U.IdUnidad=A.IdUnidad
Lo que yo haría en tu caso es comprobar si todas las áreas que tienes pertenecen a una unidad, es decir, todos los registros de la tabla Área deben tienen en su campo IdUbicacion un valor que exista en la tabla Unidad, si no es así, yo comprobaría porque, y si no tiene ninguna razón de ser intentaría arreglar los datos, porque eso indica que tienes una inconsistencia en la base de datos. Utilizaremos un LEFT JOIN para aquellas áreas que no tengan Unidad.
Del mismo modo, si existen registros de la tabla Responsable que no tienen una área asignada, o el dato del campo idarea de la tabla Responsable no tiene un valor que se corresponda con la tabla Área, revisaría lo mismo, intentando no tener inconsistencias.
Te quedaría así la sentencia:
SELECT R.Nombre,
R.ApellidoP,
R.ApellidoM,
P.NombrePuesto,
U.NombreUnidad,
U.Ubicación,
A.NombreArea
FROM Responsable R
 INNER JOIN Puesto P ON P.IdPuesto=R.IdPuesto
 LEFT JOIN Area A ON A.IdArea=R.IdArea
 LEFT JOIN Unidad U ON U.IdUnidad=A.IdUnidad
Hay ocasiones en las que, por una razón u otra se decide que ciertas claves foráneas admitan NULL, a lo mejor eso es lo que te está pasando.
Me cuentas como tienes los datos y vemos la mejor manera para adecuar tu consulta.
Respecto a la inserción de registros ¿cómo piensas hacerla? Si me cuentas cómo lo vas a hacer te puedo dar algún consejo para hacerlo de la forma más eficiente posible.
Muchas gracias, si me fue de gran ayuda ya me aparecen todos los registros y no solo unos cuantos y en mi diseño de la base de datos ningún campo de llaves foráneas acepta Null y muchas veces los usuarios o responsables están asignados a una área y no tienen un puesto especifico. Y todas las áreas tienen asignado una unidad.
Y con lo que te decía sobre guardar los registros me refiero que tengo un formulario en el voy a registrar usuario y tengo texbox de nombre de usuario, combox puesto, comboxArea nada más pero como te comentaba que luego no se sabría a que unidad pertenece dado que las unidades tienen en común áreas entonces agregue ub combo que se llama unidad a la hora de guardar supongo que tengo que utilizar igual una subconsulta para guardar los datos, dado que en la tabla responsable solo tengo las id de Puesto y Área más no la de Unidad dado que id unidad esta en la tabla Área. Mira la verdad no se mucho de esto por eso necesito ayuda en la forma de como guardar utilizando subconsultas dado que tengo que estar manejándolas en casi todas las tablas.
El área lleva implícita la unidad, por lo que no es necesario que guardes la unidad.
Si como dices hay áreas que se llaman igual en distintas unidades, y tal y como me has descrito la base de datos, yo pondría un combo para que seleccionen la unidad y luego el combo para el área.
A la hora de insertar un nuevo responsable:
INSERT INTO Responsable (.....) VALUES(.......)
Sin inner join ni nada, los inner join los deberás utilizar sólo al obtener los datos.
Si no te aclaras me cuentas e intento explicarte mejor.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas