Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta partiendo de una tabla detalle. (https://www.clubdelphi.com/foros/showthread.php?t=45375)

jplj 30-06-2007 19:11:41

Consulta partiendo de una tabla detalle.
 
Hola:

Hoy estoy un poco "espeso":confused: y no logro montar un consulta.

Trabajo con Access y con dos tablas maestro-detalle:
Código Delphi [-]
Campos Tabla Maestro
DNI
1_Apellido
2_Apellido
Nombre
...
Campos Tabla Detalle: Cursos
DNI
Curso
...

Lo que deseo obtener es un listado con los registros de la tabla maestra que tengan uno o varios cursos determinados.

Por ejemplo: saber quienes tienen el curso de francés, inglés y árabe.

Muchas gracias de antemano.
Juan P.

Caral 30-06-2007 19:23:38

Hola
Código SQL [-]
Select * From Maestro, Detalle
Where Detelle.curso = 'francés' and 'inglés' and 'árabe'
Order by Loquesea;
Saludos

jplj 30-06-2007 22:32:48

Muchas gracias.

jplj 01-07-2007 11:41:13

Hola:

He probado la sentencia que propones incluyendo INNER JOIN:

Código SQL [-]
SELECT maestro.dni, maestro.nombre, maestro.ape1, maestro.ape2
FROM maestro INNER JOIN detalle ON maestro.dni = detalle.dni
WHERE ((detalle.curso='francés' AND 'inglés' AND 'árabe'))
ORDER BY maestro.dni;

Pero sólo obtengo los que tienen francés, tengan o no: inglés y árabe.

gluglu 01-07-2007 12:17:36

Código SQL [-]
SELECT maestro.dni, maestro.nombre, maestro.ape1, maestro.ape2
FROM maestro INNER JOIN detalle ON maestro.dni = detalle.dni
WHERE detalle.curso='francés' AND detalle.curso='inglés' AND detalle.curso='árabe'
ORDER BY maestro.dni;

jplj 01-07-2007 19:41:52

Hola:

He probado la corrección que propones y ahora la consulta no devuelve ningún registro. Y me consta que hay registros que cumplen la condición.

Caral 01-07-2007 22:02:17

Hola
Código SQL [-]
SELECT maestro.dni, maestro.nombre, maestro.ape1, maestro.ape2, detalle.dni, detalle.curso
FROM maestro INNER JOIN detalle ON maestro.dni = detalle.dni
WHERE detalle.curso= 'francés' AND detalle.curso= 'inglés' AND detalle.curso= 'árabe'
ORDER BY maestro.dni;
Prueba asi.
Saludos

Ivanzinho 02-07-2007 11:00:39

Creo que deberías cambiar los AND por OR.
Código SQL [-]
SELECT maestro.dni, maestro.nombre, maestro.ape1, maestro.ape2, detalle.dni, detalle.curso
FROM maestro INNER JOIN detalle ON maestro.dni = detalle.dni
WHERE detalle.curso= 'francés' OR detalle.curso= 'inglés' OR detalle.curso= 'árabe'
ORDER BY maestro.dni;

Un saúdo.

jplj 02-07-2007 16:48:26

Hola:

Comentaros que con AND no se obtienen resultados y con OR se obtienen todos aquellos que tengan al menos uno de los idiomas, aunque para cada uno de ellos se obtiene un "registro".
Código Delphi [-]
Aplicando OR se obtiene:

12436576   MARTINEZ    MENDOZA   JAVIER   frances
12436576   MARTINEZ    MENDOZA   JAVIER   ingles
12436576   MARTINEZ    MENDOZA   JAVIER   arabe
23455454   LOPEZ         ALEGRIA     JUAN      ingles
78957559   DURAN         ......          ......      arabe
84878877   JIMENEZ      OLMEDO     MANUEL  frances
84878877   JIMENEZ      OLMEDO     MANUEL  ingles
84878877   JIMENEZ      OLMEDO     MANUEL  arabe

Partiendo de esta consulta que he llamado "busqueda" he creado con el asistente de Access otra que busque los duplicados.

Código SQL [-]
SELECT First([maestro].[dni]) AS maestro_dniCampo, Count([maestro].[dni]) AS NúmeroDeDuplicados
FROM busqueda
GROUP BY [busqueda].maestro.dni
HAVING (((Count([maestro].[dni]))>2));

Con esta obtenemos los duplicados y modificandola para que sólo devuelva el dni puedo obtener el listado.

Código SQL [-]
SELECT * FROM maestro
WHERE dni IN(SELECT First([maestro].[dni]) AS maestro_dniCampo FROM busqueda
GROUP BY [busqueda].personal.dni
HAVING (((Count([maestro].[dni]))>2)));

El problema ahora lo encuentro para sustituir en la última sentencia SQL busqueda por la sentencia que ha generado la primera consulta.

Por último explicar que la sentencia pretendo generarla dinámicamente en función de los criterios seleccionado por el usuario.

Un Saludo.

fjcg02 02-07-2007 22:09:44

Prueba con esto

Código SQL [-]
SELECT maestro.dni, maestro.nombre, maestro.ape1, maestro.ape2
FROM maestro INNER JOIN detalle ON maestro.dni = detalle.dni
WHERE detalle.curso in ('francés','inglés','árabe')
GROUP BY maestro.dni, maestro.nombre, maestro.ape1, maestro.ape2
ORDER BY maestro.dni
HAVING count(maestro.dni)>2;

Lógicamente, con AND no se encuentran resultados ya que ningun curso tiene los tres valores a la vez.

Cuentanos cómo te ha ido.

Saludos

jplj 03-07-2007 08:53:25

Hola.

fjcg02 funciona correctamente.

Agradecerte a ti y a Ivanzinho, Caral y gluglu el tiempo que habéis empleado en ayudarme a ampliar mis limitados conocimientos.

Un Saludo
;)

fjcg02 03-07-2007 22:31:08

Encantado.

Todos tenemos conocimientos limitados, pero la experiencia hace que en cada uno el límite esté más cerca o más lejos. ;)

Saludos


La franja horaria es GMT +2. Ahora son las 15:18:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi