none
Combinar tablas sql RRS feed

  • Pregunta

  • Hola!
    Quisiera puedan ayudarme con un caso: Tengo dos tablas tabA y tabB:
    Quisiera realizar una consulta que pueda darme el siguiente resultado. El primer registro de tabA toma los valores de las dos primeras filas de tabB, la segunda fila de tabA toma los siguientes dos filas de tabB(siempre en pares), Ninguna de las tablas tiene primary key ni llave foranea.

    Agradezco su ayuda.

    sábado, 17 de febrero de 2018 4:27

Respuestas

  • Debes crear un valor de referencia que vincule una fila de la tabla A contra dos filas de la tabla B, es importante definir el criterio de ordenamiento para establecer las referencias, por ejemplo:

    DECLARE @tabA table (A varchar(10), B varchar(10), C varchar(10));
    DECLARE @tabB table (X varchar(10), Y varchar(10));
    
    INSERT INTO @tabA VALUES
        ('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'), ('a3', 'b3', 'c3');
    INSERT INTO @tabB VALUES
        ('x1', 'y1'), ('x2', 'y2'), ('x3', 'y3'), ('x4', 'y4'), ('x5', 'y5'), ('x6', 'y6');
    
    WITH tabA AS (
        SELECT ROW_NUMBER() OVER(ORDER BY A) AS ID, A, B, C FROM @tabA),
    tabB AS (
        SELECT ((ROW_NUMBER() OVER(ORDER BY X) - 1) / 2 + 1) AS ID, 
        ROW_NUMBER() OVER(ORDER BY X) AS RN, X, Y FROM @tabB)
    SELECT 
        a.A AS C1, a.B AS C2, a.C AS C3, 
        MAX(CASE WHEN b.RN % 2 = 1 THEN b.X END) AS C4,
        MAX(CASE WHEN b.RN % 2 = 1 THEN b.Y END) AS C5,
        MAX(CASE WHEN b.RN % 2 = 0 THEN b.X END) AS C6,
        MAX(CASE WHEN b.RN % 2 = 0 THEN b.Y END) AS C7
    FROM tabA a INNER JOIN tabB b ON a.ID = b.ID
    GROUP BY a.A, a.B, a.C
    ORDER BY a.A;
    GO

    - Resultado

    domingo, 18 de febrero de 2018 1:36

Todas las respuestas

  • Hola Alain:

    Aunque esto parece más un ejercicio de estudio, y no creo que sea ese el objetivo del foro, te voy a echar un cable.

    select DISTINCT 
    
     T.a AS C1,T.b AS C2,T.c AS C3, T2.x AS C4,T2.Y AS C5, O.x AS C6, O.Y AS C7 from tabA T 
     INNER JOIN
     tabB T2  ON SUBSTRING(T.A,2,LEN(T.A))=SUBSTRING(T2.X,2,LEN(T2.X)) AND SUBSTRING(T.A,2,LEN(T.A))=SUBSTRING(T2.Y,2,LEN(T2.Y))
     CROSS APPLY(
    
     SELECT T3.x,T3.y FROM tabB T3 
     WHERE
    		 CONVERT(INT,(SUBSTRING(T.A,2,LEN(T.A))))*2=(CONVERT(INT,(SUBSTRING(T3.X,2,LEN(T3.X))))) 
    	AND  CONVERT(INT,(SUBSTRING(T.A,2,LEN(T.A))))*2=(CONVERT(INT,(SUBSTRING(T3.Y,2,LEN(T3.Y)))))
     ) AS O
    

    Esto puede ayudarte.

    Un saludo

    sábado, 17 de febrero de 2018 7:51
  • Parece para algoritmo de encriptado.
    sábado, 17 de febrero de 2018 18:04
  • Muchas gracias Javi, pero la consulta no generará el resultado deseado si se cambia los valores de las tablas por datos mas reales. Toda la lógica estará dentro de un procedimiento almacenado que inserta registros a una tabla. De todas maneras agradezco tu ayuda.
    domingo, 18 de febrero de 2018 0:47
  • Debes crear un valor de referencia que vincule una fila de la tabla A contra dos filas de la tabla B, es importante definir el criterio de ordenamiento para establecer las referencias, por ejemplo:

    DECLARE @tabA table (A varchar(10), B varchar(10), C varchar(10));
    DECLARE @tabB table (X varchar(10), Y varchar(10));
    
    INSERT INTO @tabA VALUES
        ('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'), ('a3', 'b3', 'c3');
    INSERT INTO @tabB VALUES
        ('x1', 'y1'), ('x2', 'y2'), ('x3', 'y3'), ('x4', 'y4'), ('x5', 'y5'), ('x6', 'y6');
    
    WITH tabA AS (
        SELECT ROW_NUMBER() OVER(ORDER BY A) AS ID, A, B, C FROM @tabA),
    tabB AS (
        SELECT ((ROW_NUMBER() OVER(ORDER BY X) - 1) / 2 + 1) AS ID, 
        ROW_NUMBER() OVER(ORDER BY X) AS RN, X, Y FROM @tabB)
    SELECT 
        a.A AS C1, a.B AS C2, a.C AS C3, 
        MAX(CASE WHEN b.RN % 2 = 1 THEN b.X END) AS C4,
        MAX(CASE WHEN b.RN % 2 = 1 THEN b.Y END) AS C5,
        MAX(CASE WHEN b.RN % 2 = 0 THEN b.X END) AS C6,
        MAX(CASE WHEN b.RN % 2 = 0 THEN b.Y END) AS C7
    FROM tabA a INNER JOIN tabB b ON a.ID = b.ID
    GROUP BY a.A, a.B, a.C
    ORDER BY a.A;
    GO

    - Resultado

    domingo, 18 de febrero de 2018 1:36
  • Muchas gracias Willams, es justo lo que buscaba. Gracias.
    lunes, 19 de febrero de 2018 3:03