locked
Consulta de un inner join relacionar tablas RRS feed

  • Pregunta

  • tengo 3 tablas

    personas

    id_persona

    nombre

    alumnos

    id_alumno

    nombre

    y carreras 

    id_carrera

    nombre_carrera

    necesito relacionarlas para que me muestre nombre del alumno que esta guardada en la tabla personas, relacionarla a la tabla carreras para que me muestre el nombre de la carrera a  la que esta inscrito

    me mostraria id del alumno  nombre del alumno y nombre de la carrera

    lunes, 12 de junio de 2017 21:17

Respuestas

  • Tienes un error en el modelo, la entidad Alumno no se relaciona de manera directa con la entidad Carrera sino mediante la entidad Matricula, entiendo que la entidad Personas es la generalización del alumno.

    - Creación de objetos (acercamiento básico)

    CREATE TABLE dbo.Personas (idPersona int PRIMARY KEY, Nombre varchar(100), 
    		   Direccion varchar(100));
    CREATE TABLE dbo.Alumnos (idAlumno int PRIMARY KEY, 
    		   idPersona int REFERENCES dbo.Personas(idPersona), CodigoAlumno int);
    CREATE TABLE dbo.Carreras (idCarrera int PRIMARY KEY, Codigo varchar(10), Nombre varchar(100));
    CREATE TABLE dbo.Matricula (idMatricula int PRIMARY KEY, 
    		   idAlumno int REFERENCES dbo.Alumnos(idAlumno), 
    		   idCarrera int REFERENCES dbo.Carreras(idCarrera))
    GO

    - Consulta de selección

    SELECT
        p.Nombre AS NombreAlumno, c.Nombre AS NombreCarrera
    FROM
        Personas p
        INNER JOIN Alumnos a ON p.idPersona = a.idPersona
        INNER JOIN Matricula m ON a.idAlumno = m.idAlumno
        INNER JOIN Carreras c ON m.idCarrera = c.idCarrera
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 12 de junio de 2017 22:36

Todas las respuestas

  • Saludos.

    Inicialmente pienso que con 2 tablas tienes, Alumnos y Carreras, ya si quieres una tercera tabla seria algo como tipo.

    Usuario, Tipo y Carrera

    Donde un usuario Puede tener un Tipo y una carrera puede tener multiples Usuarios.

    Te quedaria algo como.

    TblTipo:

    • tipo_id int
    • tipo_nombre varchar (100)

    Datos tabla Tipo(1,docente)

    Datos tabla Tipo(2,estudiante)

    Datos tabla Tipo(3,coordinador)

    TblUsuario:

    • usuario_id int
    • usuario_tipo_id int
    • usuario_nombre varchar(200)

    Datos tabla usuario(1,2,pepito perez)

    Datos tabla usuario(2,1,humberto gonzalez)

    Datos tabla usuario(3,3,camilo p.)

    TblCarrera:

    • carrera_id int
    • carrera_usuario_id
    • carrera_nombre varchar(200)
    • carrera_descripcion varchar(200)

    Datos tabla carrera(1,1,ingenieria,ingenieria de sw por ciclos), solo seria un solo registro suponiendo que en la tabla carreras solo pueden estudiar las personas de tipo estudiante.

    Para realizar la relacion de las tablas serial algo como

        FOREIGN KEY (carrera_usuario_id) REFERENCES usuarios(usuario_id)

    Espero sea de ayuda.


    lunes, 12 de junio de 2017 21:41
  • Hola, para relacionar las tablas en una consulta según el modelo que te han propuesto deberías utilizar los oepradores join


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Solo dejo mis respuestas en el foro si son votadas o respuesta, de lo contrario por mantener el orden las borro.Saludos. Lima-Perú.

    lunes, 12 de junio de 2017 22:06
  • select al.nombre,al.idalumno,al.nombre,ca.nombre from personas pe

    inner join alumnos al on al.idpersona=pe.idpersona  

    inner join carreras ca on ca.idalumno=al.idalumno  


    lunes, 12 de junio de 2017 22:23
  • Hola Manuel120294:

    Veo que se trata de una tarea, en la cual debes buscar la forma de relacionar las tablas, luego aparecen las reglas de negocio o los requermientos que se dice: 

    Un alumno es lo mismo que una persona (en tu sistema)?

    Una persona con cuantos alumnos se relaciona?

    Un alumno con cuantas materias se relaciona (un alumno - una materia), (un alumno - varias materias) (varios alumnos - varias materias)?

    Normalmente para esta relación se da la ultima opción, osea muchos a muchos, lo que se conoce como relación debil, luego necesitas crear una tabla de relación que rompa la relación débil (MateriasPorAlumno o como la quieras llamar); en esta tabla van las claves primarias de las tablas materias y alumnos.

    Luego para lo solicitado acá:

    "me mostraria id del alumno  nombre del alumno y nombre de la carrera"

    Es cuestion de que hagas uso del INNER JOIN, osea algo como:

    SELECT 
     a.id
     ,a.nombre as [Nombre Alumno]
     ,c.nombre as [Nombre de la carrera] 
    FROM Alumnos a
     INNER JOIN
      MateriasXAlumno ma on a.id=ma.idAlumno
     INNER JOIN
      Materias m ON ma.idMateria = m.id
    /* -- seccion de filtros segun necesidad de la tarea.
    WHERE 
     a.nombre like '%%'
     OR  a.nombre like 'Juan%'
     OR  a.nombre like '%Juan'
    */

    Saludos cordiales.


    Camilo Villa

    lunes, 12 de junio de 2017 22:27
  • Tienes un error en el modelo, la entidad Alumno no se relaciona de manera directa con la entidad Carrera sino mediante la entidad Matricula, entiendo que la entidad Personas es la generalización del alumno.

    - Creación de objetos (acercamiento básico)

    CREATE TABLE dbo.Personas (idPersona int PRIMARY KEY, Nombre varchar(100), 
    		   Direccion varchar(100));
    CREATE TABLE dbo.Alumnos (idAlumno int PRIMARY KEY, 
    		   idPersona int REFERENCES dbo.Personas(idPersona), CodigoAlumno int);
    CREATE TABLE dbo.Carreras (idCarrera int PRIMARY KEY, Codigo varchar(10), Nombre varchar(100));
    CREATE TABLE dbo.Matricula (idMatricula int PRIMARY KEY, 
    		   idAlumno int REFERENCES dbo.Alumnos(idAlumno), 
    		   idCarrera int REFERENCES dbo.Carreras(idCarrera))
    GO

    - Consulta de selección

    SELECT
        p.Nombre AS NombreAlumno, c.Nombre AS NombreCarrera
    FROM
        Personas p
        INNER JOIN Alumnos a ON p.idPersona = a.idPersona
        INNER JOIN Matricula m ON a.idAlumno = m.idAlumno
        INNER JOIN Carreras c ON m.idCarrera = c.idCarrera
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 12 de junio de 2017 22:36