Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problemas con extracción de datos (https://www.clubdelphi.com/foros/showthread.php?t=14559)

Pablo Carlos 23-09-2004 23:24:45

Problemas con extracción de datos
 
Hola gente... uso paradox y delphi 5... tengo la siguiente consulta->
Código Delphi [-]
Select DatosPersonales_id,

DAT_Apellido + ', ' + DAT_Nombres,

ASI_id_Profesor,

ASI_HoraEntrada,

ASI_HoraSalida,

ASI_FechaEntrada,

ASI_FechaSalida,

MPR_Anio,

MPR_Hora,

MAT_Materia,

MPR_Dia,

MPR_Division

From DatosPersonales.db,

Asistencia.db,

Profesores.db,

MateriaProfesor.db,

Materias.db

Where PRO_id_DatosPersonales = DatosPersonales_id

and ASI_id_Profesor = Profesores_id //aqui deberia modificar???

and MPR_id_Profesor = Profesores_id

and MPR_id_Materia = Materias_Id

and ASI_FechaEntrada = :pFecha

and MPR_Dia = :pDia /// Jueves por ejemplo

and PRO_Condicion = 'A'

and MPR_Turno = :pTurno

order by 8, 12

con esta consulta recupero todos los que reunen las condiciones puestas...
Lo que no puedo hacer es recuperar los profesores que no figuran en la tabla asistencia dentro de la fecha pasada por parametro.. (habrá prof que no estén en la tabla asistencia por que no asistieron pero si debian venir...
sugerencias....¡bienvenidas!
Gracias

roman 24-09-2004 01:45:24

Debes usar un OUTER JOIN, por ejemplo:

Código SQL [-]
select campos
from Asistencias
left join Profesores
  on Profesores.Id = Asistencias.Id_Profesor

// Saludos

Pablo Carlos 26-09-2004 16:58:51

Gracias Roman...

En la prueba me trae sólo el mismo prof que firmo pero más veces (repetido)...
Aclaro tablas paradox ... delphi 5 ... sql explorer ...
Saludos

Pablo Carlos 27-09-2004 18:48:00

Cita:

Empezado por Pablo Carlos
En la prueba me trae sólo el mismo prof que firmo pero más veces (repetido)...
Aclaro tablas paradox ... delphi 5 ... sql explorer ...
Saludos

Saludos :D

Pablo Carlos 29-09-2004 02:30:17

Pueden revisar este codigo (sql)?
 
Hola.. Este código me trae lo que necesito pero exactamente 70 veces repetido.. :D :D ¿pueden revisarlo?
Código:

Select DatosPersonales_id, DAT_Apellido + ', ' + DAT_Nombres,ASI_id_Profesor,ASI_HoraEntrada,ASI_FechaEntrada,
MPR_Dia, MPR_Division
From  DatosPersonales.db,Asistencia.db,MateriaProfesor.db,          Materias.db,Profesores.db
left JOIN Profesores on
Profesores_id = ASI_id_Profesor
where  PRO_id_DatosPersonales = DatosPersonales_id
        and  ASI_id_Profesor = Profesores_id
        and  MPR_id_Profesor = Profesores_id
        and  MPR_id_Materia = Materias_Id
        and  ASI_FechaEntrada = '09/09/2004'
        and  MPR_Dia = 'Jueves'
        and PRO_Condicion0 = 'A'
        and  MPR_Turno = 'T'


roman 29-09-2004 02:45:27

Quizá ayude que quites profesores.db de la cláusula FROM ya que ya la incluyes en el JOIN.

// Saludos

Pablo Carlos 29-09-2004 02:51:08

Gracias por responder... pero si quito a Profesores.db sólo trae aquel que si esta en Asistencia (solo el que firmo) y necesito el que firmo (asistió) y el que no firmo pero sí debia venir ese día.Saludos

basti 29-09-2004 12:36:28

Creo que el problema está en poner todas las tablas en el FROM. Al hacer esto se van a repetir los resultados tantas veces como (por ejemplo) materias existan. Si pasas las tablas al LEFT JOIN no se debería de repetir.

Algo así:

Código SQL [-]
 Select DatosPersonales_id, DAT_Apellido + ', ' + DAT_Nombres,ASI_id_Profesor,ASI_HoraEntrada,ASI_FechaEntrada,
 MPR_Dia, MPR_Division
 From  Asistencia.db,Profesores.db
 left outer JOIN DatosPersonales.db on
   pro_id_DatosPersonales = DatosPersonales_id
 left outer join MateriaProfesor.db on
   MPR_id_Profesor = Profesores_id
 left outer join Materias.db on
   MPR_id_Materia = Materias_Id
 where   ASI_id_Profesor = Profesores_id
     and  ASI_FechaEntrada = '09/09/2004' 
     and  MPR_Dia = 'Jueves'
     and PRO_Condicion0 = 'A'
     and  MPR_Turno = 'T'

Un saludo

Pablo Carlos 29-09-2004 13:12:38

Gracias por responder...pero quitando las tablas del From estoy como mi primer duda... solo trae el prof que sí asistió y no todos lo que hayan venido más lo que tendrían que venir y que no lo hicieron...

Saludos

basti 29-09-2004 14:03:37

Si no entiendo mal, la tabla MateriaProfesor es la que tiene todas las clases a las que deberían asistir los profesores. Entonces la tabla MateriaProfesor debería ser la única de la clausula FROM. Además si pones el filtro ASI_FechaEntrada = '09/09/2004', no te mostrará los que no se encuentran en la tabla Asistencia, creo que debería funcionar de la siguiente manera:

Código SQL [-]
 Select DatosPersonales_id, DAT_Apellido + ', ' + DAT_Nombres,ASI_id_Profesor,ASI_HoraEntrada,ASI_FechaEntrada,
 MPR_Dia, MPR_Division
 From  MateriaProfesor.db
 left outer join Profesores.db on
   MPR_id_Profesor = Profesores_id
 left outer join Asistencia.db on
   ASI_id_Profesor = Profesores_id
 left outer JOIN DatosPersonales.db on
   pro_id_DatosPersonales = DatosPersonales_id
 left outer join Materias.db on
   MPR_id_Materia = Materias_Id
 where  (ASI_FechaEntrada = '09/09/2004'  or 
              MPR_id_Profesor not in (select ASI_id_Profesor from Asistencia.db 
                                            where ASI_FechaEntrada = '09/09/2004'))

     and  MPR_Dia = 'Jueves'
     and PRO_Condicion0 = 'A'
     and  MPR_Turno = 'T'

un saludo

Pablo Carlos 29-09-2004 14:10:42

Cita:

Empezado por basti
creo que debería funcionar de la siguiente manera:

Basti podría decirte que te haz equivocado en ese "creo" deberías decir así va a funcionar :D :D ¡extrae lo que necesito!!!
Gracias a todos por esta ayuda
Saludos

roman 29-09-2004 16:16:24

Sí, muy bien basti. La verdad es que yo por flojera me concentré sólo en una tabla y me olvidé del resto. :o

// Saludos

Pablo Carlos 29-09-2004 22:55:06

Cita:

Empezado por roman
Debes usar un OUTER JOIN, por ejemplo:

Código SQL [-]
select campos
from Asistencias
left join Profesores
on Profesores.Id = Asistencias.Id_Profesor

// Saludos

De todos modos distes el puntapie inicial... ademas que toda la solución estaba, como dijistes, en left join...
Gracias roman


La franja horaria es GMT +2. Ahora son las 19:46:22.

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