none
Consulta en 3 Tablas RRS feed

  • Pregunta


  • Hola

    tabla  : csgf_student

    Campos : matricula   ,  apellido1 , apellido2 , nombre

    tabla : csgf_student_enrollment

    Campos : matricula , year_id , course_id

    ejecuto esta consulta y fino

    SELECT csgf_student_enrollment.matricula AS Matricula ,
    CONCAT( csgf_student.apellido1,' ', csgf_student.apellido2,' , ', csgf_student.nombre) AS Nombre
    FROM santagema.csgf_student_enrollment , csgf_student
    WHERE csgf_student_enrollment.course_id = @par1 AND csgf_student_enrollment.year_id=@par2
    AND csgf_student_enrollment.matricula =  csgf_student .matricula  ORDER BY csgf_student.apellido1 ASC

    pero ahora tengo la tabla csgf_web_app con los campos matricula , date , falta

    Nesecito agregar el campo falta en la consulta anterior (obvio que el campo relacion con las otras 2 tablas es Matricula) con la condicion que date sea igual a la fecha actual.


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    miércoles, 29 de junio de 2016 19:25

Respuestas

  • Hola que tal asi como te comenta Alberto deberias de usar los joins, aqui te paso una imagen como deberias de implementarlos segun tu logica de negocio.

    Cualquier cosa nos comentas.

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 15:49
    jueves, 30 de junio de 2016 0:39
  • Te recomiendo que uses la sintaxis moderna con JOIN ... ON en lugar de la antiquísima que une las tablas poniendo en el WHERE la condición de unión.

    SELECT csgf_student_enrollment.matricula AS Matricula , 
    CONCAT( csgf_student.apellido1,' ', csgf_student.apellido2,' , ', csgf_student.nombre) AS Nombre 
    FROM santagema.csgf_student_enrollment
    join csgf_student on csgf_student_enrollment.matricula =  csgf_student.matricula
    join csgf_web_app on csgf_web_app = sgf_student_enrollment.matricula
    WHERE csgf_student_enrollment.course_id = @par1 AND csgf_student_enrollment.year_id=@par2
    AND DATE(csgf_web_app.[date]) = DATE(getdate())
    ORDER BY csgf_student.apellido1 ASC 

    Las dos funciones DATE que te he puesto sirven para quitar las horas, minutos y segundos al comparar las fechas. Si el campo es de tipo DATE (y no DATETIME) se puede suprimir la primera, y eso aumentará el rendimiento en caso de que dicho campo esté indexado.

    miércoles, 29 de junio de 2016 19:43
  • Efrain Mejias Castillo,

    Sólo cambia el modo de combinación de INNER JOIN a LEFT JOIN:

    SELECT 
    	se.matricula AS Matricula, 
    	CONCAT(s.apellido1,' ', s.apellido2,' , ', s.nombre) AS Nombre,
    	ISNULL(w.falta, '') AS Falta
    FROM 
    	csgf_student s
    	INNER JOIN santagema.csgf_student_enrollment se ON s.matricula =  se.matricula
    	LEFT JOIN csgf_web_app w ON s.matricula = w.matricula
    		AND CONVERT(date, w.[date]) = CONVERT(date, GETDATE())
    WHERE 
    	se.course_id = @par1 
    	AND se.year_id = @par2	
    ORDER BY 
    	s.apellido1 ASC;

    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 15:49
    miércoles, 29 de junio de 2016 21:52

Todas las respuestas

  • Te recomiendo que uses la sintaxis moderna con JOIN ... ON en lugar de la antiquísima que une las tablas poniendo en el WHERE la condición de unión.

    SELECT csgf_student_enrollment.matricula AS Matricula , 
    CONCAT( csgf_student.apellido1,' ', csgf_student.apellido2,' , ', csgf_student.nombre) AS Nombre 
    FROM santagema.csgf_student_enrollment
    join csgf_student on csgf_student_enrollment.matricula =  csgf_student.matricula
    join csgf_web_app on csgf_web_app = sgf_student_enrollment.matricula
    WHERE csgf_student_enrollment.course_id = @par1 AND csgf_student_enrollment.year_id=@par2
    AND DATE(csgf_web_app.[date]) = DATE(getdate())
    ORDER BY csgf_student.apellido1 ASC 

    Las dos funciones DATE que te he puesto sirven para quitar las horas, minutos y segundos al comparar las fechas. Si el campo es de tipo DATE (y no DATETIME) se puede suprimir la primera, y eso aumentará el rendimiento en caso de que dicho campo esté indexado.

    miércoles, 29 de junio de 2016 19:43
  • hola ...Alberto Poblacion

    Pruebo y te comento....


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    miércoles, 29 de junio de 2016 21:24
  • hola

    me devuelve esto...por que del grupo solo el tiene falta.....
    Deberia devolverme todas las matriculas y todos los nombres del grupo ( el que no tenga falta el campo en blanco )


    EFRAIN MEJIAS C VALENCIA - VENEZUELA


    miércoles, 29 de junio de 2016 21:27
  • Efrain Mejias Castillo,

    Sólo cambia el modo de combinación de INNER JOIN a LEFT JOIN:

    SELECT 
    	se.matricula AS Matricula, 
    	CONCAT(s.apellido1,' ', s.apellido2,' , ', s.nombre) AS Nombre,
    	ISNULL(w.falta, '') AS Falta
    FROM 
    	csgf_student s
    	INNER JOIN santagema.csgf_student_enrollment se ON s.matricula =  se.matricula
    	LEFT JOIN csgf_web_app w ON s.matricula = w.matricula
    		AND CONVERT(date, w.[date]) = CONVERT(date, GETDATE())
    WHERE 
    	se.course_id = @par1 
    	AND se.year_id = @par2	
    ORDER BY 
    	s.apellido1 ASC;

    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 15:49
    miércoles, 29 de junio de 2016 21:52
  • Willams Morales

    Pruebo y te comento gracias...


    EFRAIN MEJIAS C VALENCIA - VENEZUELA


    miércoles, 29 de junio de 2016 23:39
  • Hola que tal asi como te comenta Alberto deberias de usar los joins, aqui te paso una imagen como deberias de implementarlos segun tu logica de negocio.

    Cualquier cosa nos comentas.

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 15:49
    jueves, 30 de junio de 2016 0:39