Access-consulta para excluir duplicados sin eliminarlos

Y perdón por mi ignorancia. Necesito un experto que me explique con lenguaje sencillo (nivel Access intermedio) como crear una consulta de exclusión. Os explico: Tengo una tabla llamada ALUMNOS con 2 campos: IdAlumno (clave principal) y Nombre. Tengo otra tabla llamada CURSOS con 2 campos: Referencia (clave principal) y Título. Y por último otra tabla llamada HISTORICO con 4 campos: IdAlumno; Referencia; Fecha Adjudicación y Fecha Realización.

He creado las relaciones uno a varios de la tabla ALUMNOS y CURSOS con la TABLA HISTORICO. Necesito crear una consulta para que me muestre para un ALUMNO concreto los cursos que no ha realizado, pero solo él. Yo he creado una donde en criterio IdAlumno le escribo <>[IdAlumno escogido] O Es NULO y en Fecha Realización le he puesto el criterio Es Nulo. Pero tengo el problema de que aparecen en la consulta la Referencia de cursos realizados por el alumno escogido pero que cumplen el criterio de que están pendientes de realizar por alumnos distintos al escogido y que tienen el campo Fecha Realización como Es Nulo.

En síntesis necesito una consulta que me muestre solo los cursos NO REALIZADOS por un alumno concreto del total de la lista de cursos disponibles aunque hayan sido realizados por otros alumnos.

1 respuesta

Respuesta
1

En pocas palabras, necesitas crear una consulta con una subconsulta, de tal forma que tu consulta devuelva los registros que no están en esa subconsulta.

Me explico con más calma:

En primer lugar creas una consulta, en vista diseño o con el asistente, principalmente para saber su SQL y usarla en la consulta definitiva como subconsulta.

En tu caso podría ser ésta (sobre la tabla Historico):

SELECT Historico.Referencia
FROM Historico
WHERE (((Historico.IdAlumno)=[ID Alumno]) AND ((Historico.FechaRealizacion) Is Not Null))

Que te devuelve, para el alumno del que introduzcas su ID todos los cursos en que está apuntados y tienen fecha de realización.

El siguiente paso es crear tu consulta definitiva, en este caso sobre la tabla Cursos, y como criterio para el campo Referencia le pones los que no estén en la consulta anterior. Para eso usas NOT IN y la SQL de tu subconsulta, es decir, al final te quedará:

SELECT Cursos.Referencia, Cursos.Titulo
FROM Cursos
WHERE Cursos.Referencia NOT IN (SELECT Historico.Referencia
FROM Historico
WHERE (((Historico.IdAlumno)=[ID Alumno]) AND ((Historico.FechaRealizacion) Is Not Null)));

Para que lo veas más claro, te adjunto un mini-ejemplo: http://www.filebig.net/files/bCpMJ4Mg2h 

Saludos!


¡Gracias! ME QUITO EL SOMBRERO!!!. Funciona a la perfección. Busqué en muchos foros y constantemente me proponían el argumento DISTINCT pero no conseguía que funcionara. Ahora es perfecto. Gracias

Buenos días  Sveinbjorn El Rojo,  perdona que insista con la pregunta. Tu ejemplo era perfecto y funciona a la perfección. Pero tengo el problema de que las tablas y los campos de mi base no eran exactamente los mismos. Si los cambiaba por los que tu me adjuntaste, funcionaba bien, pero eso me suponía modificar el resto de consultas que tengo, un montón de formularios e informes. Traté de cambiar el código que me adjuntaste modificando los nombres que cambiaban pero me da un error de sintaxis en la expresión de consulta.

Lo puse del siguiente modo:

SELECT tb_CURSOS.Referencia, tb_CURSOS.Título

FROM [tb_historico cursos]

WHERE tb_CURSOS.Referencia NOT IN (SELECT tb_historico cursos. Referencia

FROM tb_historico cursos

WHERE (((tb_historico cursos.IdCursillista)=[ID Alumno]) AND ((tb_historico cursos.Fecha Realización) Is Not Null)));

No sé donde puede estar el error. Te agradecería muchísimo tu ayuda pues se trata de una base con 40 cursillistas, un catalogo de 270 cursos y un histórico de 4 años. Te adjunto las bases con las tablas en cuestión con solo unos pocos registros por si me puedes "iluminar".

te lo adjunto aquí: http://www.filebig.net/files/ChfNsibF5r 

Muchas gracias por anticipado

Sin ver la BD, presumo que el error está en el nombre de la segunda tabla (tb_historico cursos), por tener un espacio en blanco. Lo mismo con el campo "Fecha Realización".

Prueba a poner el nombre entre corchetes como haces en el primer FROM:

SELECT tb_CURSOS.Referencia, tb_CURSOS.Título

FROM [tb_historico cursos]

WHERE tb_CURSOS.Referencia NOT IN ([SELECT tb_historico cursos]. Referencia

FROM [tb_historico cursos]

WHERE ((([tb_historico cursos].IdCursillista)=[ID Alumno]) AND (([tb_historico cursos].[Fecha Realización]) Is Not Null)));

Como consejo, no utilices nunca acentos, signos "raros", ni espacios en blanco en los nombres de las tablas y los campos.

Saludos!


¡Gracias! Efectivamente, la clave estaba en los corchetes. Será cuestión de aprender SQL. Excelente explicación, muchas gracias

Añade tu respuesta

Haz clic para o
El autor de la pregunta ya no la sigue por lo que es posible que no reciba tu respuesta.

Más respuestas relacionadas