none
Consulta para buscar datos de dos tablas RRS feed

  • Pregunta

  • Primera Tabla

    Clases Tabla

    Codigo Clase    Curso_1     Curso_2     Curso_3     Curso_4     Curso_5

       Mate 100          1               2             0                 0                0

    Cursos Tabla

    Num_Curso      Descripcion

           1              Programacion de computadoras

           2              Reparacion de Computadoras

    asi quiero que salga la consulta

    Codigo_Clase     Descripcion_1                                      Descripcion_2

    Mate 100           Programacion de computadoras             Reparacion de computadoras

    osea quiero una consulta que  busque en la table clase_Tabla y me diga los nombres de los cursos que se dan con esa clase y que busque el numero del curso y la descripcion de la table Cursos table donde me dice que el 1 le corresponde a programacion y el 2 a reparacion, gracias

    lunes, 3 de agosto de 2015 19:48

Respuestas

  • Hola Efrain Diaz,

    Con toda la buena onda, si estás a tiempo de modificar el modelo, hazlo!!!, te ahorrarás muchos problemas.

    La clase no tiene Cursos, quizá pueda tener horarios asignados, en todo caso, lo mejor es que CursosClase sea una tabla que derive de las tablas Clase y Curso: N:M

    Aún así, si insistes en mantener el modelo tal y como lo tienes no será problema porque siempre defines 5 cursos - insisto en que el modelo es pésimo -, pero vamos, puedes hacer lo siguiente.

    SELECT
      cla.CodigoClase,
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_1)) [Descripcion1],
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_2)) [Descripcion2],
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_3)) [Descripcion3],
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_4)) [Descripcion4],
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_5)) [Descripcion5]
    FROM
      ClasesTabla AS cla

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ


    lunes, 3 de agosto de 2015 20:13

Todas las respuestas

  • no se entiende lo que quieres hacer  puedes hacer un inner join osea unir las dos tablas y sacar de ahi los datos o si te pudieras explicar mas 
    lunes, 3 de agosto de 2015 20:13
  • Hola Efrain Diaz,

    Con toda la buena onda, si estás a tiempo de modificar el modelo, hazlo!!!, te ahorrarás muchos problemas.

    La clase no tiene Cursos, quizá pueda tener horarios asignados, en todo caso, lo mejor es que CursosClase sea una tabla que derive de las tablas Clase y Curso: N:M

    Aún así, si insistes en mantener el modelo tal y como lo tienes no será problema porque siempre defines 5 cursos - insisto en que el modelo es pésimo -, pero vamos, puedes hacer lo siguiente.

    SELECT
      cla.CodigoClase,
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_1)) [Descripcion1],
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_2)) [Descripcion2],
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_3)) [Descripcion3],
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_4)) [Descripcion4],
      (SELECT Descripcion FROM CursosTabla cur WHERE (cur.Num_Curso = cla.Curso_5)) [Descripcion5]
    FROM
      ClasesTabla AS cla

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ


    lunes, 3 de agosto de 2015 20:13
  • Yo te propongo esta solución, pero no es el resultado que esperas si no como debería de ser si tuvieras tu base normalizada correctamente.

    DECLARE @t1 TABLE ( 
    		codigoClase VARCHAR(100)
    		, curso1 TINYINT
    		, curso2 TINYINT
    		, curso3 TINYINT
    		, curso4 TINYINT
    		, curso5 TINYINT )
    
    DECLARE @t2 TABLE( 
    	numCurso VARCHAR(100), descripcion VARCHAR(100) )
    
    
    INSERT INTO @t1
    VALUES( 'Mate100' , 1 , 2 , 0 , 0 , 0  )
    , ( 'Otra' , 2 , 0 , 0 , 0 , 0 )
    
    INSERT INTO @t2
    VALUES( 1, 'programacion de computadoras' )
    , ( 2, 'reparacion de computadoras' )
    
    
    SELECT codigoClase, a.numCurso, b.descripcion
    FROM 
    (
    	SELECT codigoClase, curso1, curso2, curso3, curso4, curso5 
    	FROM @t1 
    ) AS p
    UNPIVOT (
    	numCurso FOR nomCol IN ( curso1, curso2, curso3, curso4, curso5 )
    ) AS a
    INNER JOIN @t2 AS b
    ON a.numCurso = b.numCurso
    
    SALUDOS!

    SERGIO SANCHEZ ARIAS
    facebook twitter blogger google

    lunes, 3 de agosto de 2015 20:23
  • Hola,

    Lo más óptimo sería hacer uso de Cross Apply e ir tomando los valores que requerimos de uno a uno,

    Prueba de esta manera:

    DECLARE @Clases TABLE
    (
    Codigo_Clase varchar(20),
    Curso_1  INT,
    Curso_2  INT,
    Curso_3  INT,
    Curso_4  INT,
    Curso_5 INT
    )
    
    INSERT INTO @Clases(Codigo_Clase, Curso_1, Curso_2, Curso_3, Curso_4, Curso_5)
    SELECT 'Mate 100', 1, 2, 0, 0, 0 UNION ALL
    SELECT 'Mate 200', 1, 0, 0, 0, 1;
    
    
    DECLARE @Cursos TABLE
    (
    Num_Curso INT,
    Descripcion varchar(50)
    )
    
    INSERT INTO @Cursos(Num_Curso, Descripcion)
    SELECT 1, 'Programacion de computadoras' union all
    SELECT 2, 'Reparacion de Computadoras';
    
    
    SELECT
        A.Codigo_Clase, 	
        MAX(CASE WHEN B.Descripcion = 'Descripcion_1' THEN C.Descripcion END) AS Descripcion_1,    
        MAX(CASE WHEN B.Descripcion = 'Descripcion_2' THEN C.Descripcion END) AS Descripcion_2,   
        MAX(CASE WHEN B.Descripcion = 'Descripcion_3' THEN C.Descripcion END) AS Descripcion_3,  
        MAX(CASE WHEN B.Descripcion = 'Descripcion_4' THEN C.Descripcion END) AS Descripcion_4, 
        MAX(CASE WHEN B.Descripcion = 'Descripcion_5' THEN C.Descripcion END) AS Descripcion_5
    FROM
    	@Clases AS A
    	CROSS APPLY
    	(
    	VALUES
    	    (A.Curso_1, 'Descripcion_1'),
    	    (A.Curso_2, 'Descripcion_2'),
    	    (A.Curso_3, 'Descripcion_3'),
    	    (A.Curso_4, 'Descripcion_4'),
    		(A.Curso_5, 'Descripcion_5')
    	) AS B(Num_Curso, Descripcion)
    	INNER JOIN
    	@Cursos AS C
    	ON C.Num_Curso= B.Num_Curso
    WHERE
        B.Num_Curso IS NOT NULL
    GROUP BY
        A.Codigo_Clase
    GO
    

    Si tienes alguna consulta no dudes en hacerla.

    Saludos!


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    lunes, 3 de agosto de 2015 20:24
  • Amigo William siempre agradezco tus grandes consejos, quiero comentarte algo, en ocasiones no pongo toda la informacion por que lo que busco es un resultado en especifico y es el capturer datos, yo entiendo perfectamente que las clases no llevan cursos si no mas bien es alrevez, pero eso siempre depende de lo que yo quiero hacer en mi proyecto, cuando entro las clases le indico a que cursos puede pertenecer por que se pueden dar una misma clase en varios cursos y necesito de antemano tener esa informacion y crei prudente ponerlo de esa forma, gracias por tu aporte siempre ......
    martes, 4 de agosto de 2015 0:39