none
Sobre un INNER JOIN en 3 campos RRS feed

  • Pregunta

  • Hola a todos tal vez pregunte una burrada pero tengo una duda con una consulta que no la puedo sacar.
    Espero que alguién me pueda orientar o dar una mano.
    a modo de ejemplo, tengo dos tablas:

    tbl1:         idNombre, Nombre                                                   y tbl2:  id,...,Persona1,persona2,persona3
                          1             pepe                                                                1           4           1                2
                          2             tito                                                                   2           1          2                 3
                          3             Juan                                                                 3           2           1                3

    Necesito hacer una consulta a la tabla tbl2 que en vez de los id que guarde, me muestre los 3 nombres
    Select * from tbl2
    Inner join tbl1
    ON tbl1.Id_nombre= tbl2.persona1  (solo lo puedo realizar contra un solo campo, pero nose como agregar los otros 2)
    Where tbl2.id= 3

    Pido disculpas por si no se entiende bien el ejemplo, aca no tengo mi basededatos para poner el ejemplo real, creo que asi lo comprenderia mejor, por ahora lo tengo funcionando guardado el nombre entero (varchar) en esos 3 campos "personas", pero me gustaria optimizarlo y guardar solo sus id.
    Desde ya muchas gracias.
    Saludos!
     

    miércoles, 3 de octubre de 2012 18:14

Respuestas

  • Trata:

    select
    	A.Id_mesa,
    	A.turno,
    	P1.nombre as Profesor1_nombre,
    	P2.nombre as Profesor2_nombre,
    	P3.nombre as Profesor3_nombre
    from 
    	mesaExamen as A inner join Profesor as P1 on A.Profe1 = P1.Id_profesor
    	inner join Profesor as P2 on A.Profe2 = P2.Id_profesor
    	inner join Profesor as P3 on A.Profe3 = P3.Id_profesor
    GO

    Si las columnas [persona1]..., [persona3] aceptan la marca NULL, entonces tendras que usar outer joins en vez de inner joins.


    AMB

    Some guidelines for posting questions...

    • Marcado como respuesta DonRamon jueves, 4 de octubre de 2012 2:47
    miércoles, 3 de octubre de 2012 19:39
  • OK, entonces como tu decías es así, solo que cometí un pequeño error en el query, este es el correcto : 

    declare @profesor table(
    Id_profesor int Primary key,
    nombre varchar(50)
    )
    
    declare @mesaExamen table  (
    Id_mesa int Primary key,
    turno int,
    Profe1 int,
    Profe2 int,
    Profe3 int
    )
    
    Insert into @profesor (Id_profesor,nombre)
    Values (1,'Pepe')
    Insert into @profesor (Id_profesor,nombre)
    Values (2,'Tito')
    Insert into @profesor (Id_profesor,nombre)
    Values (3,'Juan')
    
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (1,5,1,2,3)
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (2,6,2,1,3)
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (3,5,3,2,1)
    
    select * from @profesor
    select * from @mesaExamen 
    
    select m.Id_mesa, p1.nombre, p2.nombre , p3.nombre from @mesaExamen m 
    inner join @profesor p1 ON m.Profe1 = p1.Id_profesor
    inner join @profesor p2 ON m.Profe2 = p2.Id_profesor
    inner join @profesor p3 ON m.Profe3 = p3.Id_profesor
    and turno = 5


    Sergio Sánchez Arias

    • Marcado como respuesta DonRamon jueves, 4 de octubre de 2012 2:47
    miércoles, 3 de octubre de 2012 19:46

Todas las respuestas

  • Hola amigo, por lo que puedo entender creo que quieres hacer el query 3 veces a la tabla de los nombres :S algo no muy recomendable pero pues si no hay de otra, sería algo así

    SELECT t2.id , t2.persona1, t1a.nombre
    , t2.persona2, t1b.nombre
    , t2.persona2, t1c.nombre
    FROM tbl2 t2 
    INNER JOIN tbl1 t1a ON t1a.id_nombre = t2.persona1
    AND t2.id = 3
    INNER JOIN tbl1 t1b ON t1b.id_nombre = t2.persona1
    INNER JOIN tbl1 t1c ON t1c.id_nombre = t2.persona1
    

    Por lo que puedo percibir creo que está mal la estructura de datos de tus tablas, de ser posible pudieras corregirlo para obtener un mejor rendimiento.

    SALUDOS!


    Sergio Sánchez Arias

    miércoles, 3 de octubre de 2012 18:28
  • Hola Sergio, muchas gracias por tu respuesta!
     Sabes que eso no me esta funcionando 100% probe y me tira 3 id y 3 nombres, pero no me concuerda, siempre es el mismo nombre (distinto id).
    Te cuento un poco mejor la logica a ver que opinas vos, es para mostrar los datos de una "mesa de examen final" (universidad), entonces tengo una tabla profesor donde esta el nombre y datos de los profesores y la tabla examenfinal, donde entre otras  cosas tiene que tener cargado 3 profesores si o si, a mi se me ocurrio poner 3 campos de profesores, que te parece a vos? Algo mal en eso? dejo de relacionar por id y solo  guardo el nombre en texto? Hice un script rapidito asi se entiende un poco mejor.

    create table Profesor (
    Id_profesor int Primary key,
    nombre varchar(50)
    )
    
    Create table mesaExamen (
    Id_mesa int Primary key,
    turno int,
    Profe1 int,
    Profe2 int,
    Profe3 int
    )
    Insert into Profesor (Id_profesor,nombre)
    Values (1,'Pepe')
    Insert into Profesor (Id_profesor,nombre)
    Values (2,'Tito')
    Insert into Profesor (Id_profesor,nombre)
    Values (3,'Juan')
    
    insert into mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (1,5,1,2,3)
    insert into mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (2,6,2,1,3)
    insert into mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (3,5,3,2,1)
    Lo que me gustaria mostrar es esto: SELECT ......... FROM mesaExamen WHERE turno = 5
    Resultado esperado
    1,pepe,tito,Juan
    3,Juan,Tito,Pepe

    Te agradesco mucho por tu tiempo.
    Saludos!!


    miércoles, 3 de octubre de 2012 19:13
  • Con respecto a la primera solución que te dí, tienes razón, un error de dedo, sería de la siguiente manera : 

    SELECT t2.id , t2.persona1, t1a.nombre
    , t2.persona2, t1b.nombre
    , t2.persona2, t1c.nombre
    FROM tbl2 t2 
    INNER JOIN tbl1 t1a ON t1a.id_nombre = t2.persona1
    AND t2.id = 3
    INNER JOIN tbl1 t1b ON t1b.id_nombre = t2.persona2
    INNER JOIN tbl1 t1c ON t1c.id_nombre = t2.persona3

    Mira, te paso como tu lo quieres y como yo te propongo: 

    Porque en cuanto a lo que tu necesitas, que pasaría si necesitas anexar a otro profesor a tu tabla mesaExamen, tendrías que modificar la estructura de tu tabla para agregar un campo más cierto ??

    Aquí va, nos dices de que manera te funciona mejor :)

    declare @profesor table(
    Id_profesor int Primary key,
    nombre varchar(50)
    )
    
    declare @mesaExamen table  (
    Id_mesa int Primary key,
    turno int,
    Profe1 int,
    Profe2 int,
    Profe3 int
    )
    
    Insert into @profesor (Id_profesor,nombre)
    Values (1,'Pepe')
    Insert into @profesor (Id_profesor,nombre)
    Values (2,'Tito')
    Insert into @profesor (Id_profesor,nombre)
    Values (3,'Juan')
    
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (1,5,1,2,3)
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (2,6,2,1,3)
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (3,5,3,2,1)
    
    select * from @profesor
    select * from @mesaExamen 
    
    select m.Id_mesa, p1.nombre, p2.nombre , p3.nombre from @mesaExamen m 
    inner join @profesor p1 ON m.Profe1 = p1.Id_profesor
    inner join @profesor p2 ON m.Profe2 = p2.Id_profesor
    inner join @profesor p3 ON m.Profe3 = p3.Id_profesor
    and turno = 5
    
    
    -- a partir de aqui es la propuesta
    declare @mesaPropuesta table ( 
    idMesa int, turno int, Id_profesor INT )
    
    insert into @mesaPropuesta 
    values(1,5,1),(1,5,2),(1,5,3),
    (2,6,2),(2,6,1),(2,6,3),
    (3,5,3),(3,5,2),(3,5,1)
    
    select * from @mesaPropuesta
    
    select * from @mesaPropuesta m
    INNER JOIN @profesor p on m.Id_profesor = p.Id_profesor and m.turno = 5

    SALUDOS !


    Sergio Sánchez Arias



    miércoles, 3 de octubre de 2012 19:28
  • Hola Sergio, lo pense de la manera que vos me lo planteas,pero creo que eso me aumentaria demasiado las filas, por cada mesa de examenes tendria 2 filas mas. no??
    Te comento que la regla de negocio dice que tiene que haber si o si 3 profesores, y no va a cambiar en el futuro. Por eso yo preferi incluir 3 campos por examen, antes que hacer algo asi ("ProfesorNumero", idProfesor) si los campos de los profesores serian dinamicos si hubiera recurrido a esa forma.
    Es mucho consumo de recursos hacer los 3 joins? por que sino lo dejo como esta no mas (guardando el "nombre y apellido "y no el id)
    Ahora a la noche pruebo la consulta y te comento como me fue, igual creo que es lo que necesitaba.
    Te agradesco mucho por tu respuesta, si alguién se suma al planteo sobre como deberia obtener esos datos, bienvenida sean sus opiniones.
    Saludos! A la noche pruebo con mi compu (ahora estoy sin el sql server)

    • Editado DonRamon miércoles, 3 de octubre de 2012 19:39
    miércoles, 3 de octubre de 2012 19:31
  • Trata:

    select
    	A.Id_mesa,
    	A.turno,
    	P1.nombre as Profesor1_nombre,
    	P2.nombre as Profesor2_nombre,
    	P3.nombre as Profesor3_nombre
    from 
    	mesaExamen as A inner join Profesor as P1 on A.Profe1 = P1.Id_profesor
    	inner join Profesor as P2 on A.Profe2 = P2.Id_profesor
    	inner join Profesor as P3 on A.Profe3 = P3.Id_profesor
    GO

    Si las columnas [persona1]..., [persona3] aceptan la marca NULL, entonces tendras que usar outer joins en vez de inner joins.


    AMB

    Some guidelines for posting questions...

    • Marcado como respuesta DonRamon jueves, 4 de octubre de 2012 2:47
    miércoles, 3 de octubre de 2012 19:39
  • OK, entonces como tu decías es así, solo que cometí un pequeño error en el query, este es el correcto : 

    declare @profesor table(
    Id_profesor int Primary key,
    nombre varchar(50)
    )
    
    declare @mesaExamen table  (
    Id_mesa int Primary key,
    turno int,
    Profe1 int,
    Profe2 int,
    Profe3 int
    )
    
    Insert into @profesor (Id_profesor,nombre)
    Values (1,'Pepe')
    Insert into @profesor (Id_profesor,nombre)
    Values (2,'Tito')
    Insert into @profesor (Id_profesor,nombre)
    Values (3,'Juan')
    
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (1,5,1,2,3)
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (2,6,2,1,3)
    insert into @mesaExamen (Id_mesa,turno,Profe1,Profe2,Profe3)
    Values (3,5,3,2,1)
    
    select * from @profesor
    select * from @mesaExamen 
    
    select m.Id_mesa, p1.nombre, p2.nombre , p3.nombre from @mesaExamen m 
    inner join @profesor p1 ON m.Profe1 = p1.Id_profesor
    inner join @profesor p2 ON m.Profe2 = p2.Id_profesor
    inner join @profesor p3 ON m.Profe3 = p3.Id_profesor
    and turno = 5


    Sergio Sánchez Arias

    • Marcado como respuesta DonRamon jueves, 4 de octubre de 2012 2:47
    miércoles, 3 de octubre de 2012 19:46
  • Con algo como esto lo puede resolver

    USE [DatabaseName]
    GO
    
    SELECT id_mesa,
    	profesor1 = 
    		CASE profe1 
    			WHEN 1 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 1)
    			WHEN 2 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 2)
    			WHEN 3 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 3)
    		END,
    		profesor2 = 
    		CASE profe2
    			WHEN 1 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 1)
    			WHEN 2 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 2)
    			WHEN 3 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 3)
    		END,
    		profesor3 = 
    		CASE profe3
    			WHEN 1 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 1)
    			WHEN 2 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 2)
    			WHEN 3 THEN (SELECT Profesor.Nombre FROM Profesor WHERE Profesor.id_Profesor = 3)
    		END
    FROM mesaExamen
    WHERE mesaExamen.turno = 5;


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    Blog

    miércoles, 3 de octubre de 2012 23:58
  • Hola Mónica, ya te envíe correo,el mio es chancrovsky84@hotmail.com

    SALUDOS!


    Sergio Sánchez Arias

    jueves, 4 de octubre de 2012 16:29