Pour chaque ligne de sélectionner, insérez plusieurs lignes dans une table

Je veux faire quelque chose comme ça

SELECT ID, X, Y, Z FROM TABLE_1 

cela me renvoie quelque chose comme:

 | IDTABLE_1 | X | Y | Z | | 1 | a | b | c | | 2 | d | e | f | | 3 | g | h | i | 

Et j'ai une autre table TABLE_2 qui a une colonne avec les noms de colonnes de la table précédente (TABLE_1):

 | IDTABLE_2 | COLUMN | | 101 | X | | 102 | Y | | 103 | Z | 

et maintenant je dois insert toutes mes données de la sélection dans cette nouvelle table TABLE_3 et cela doit être comme ceci:

 | IDTABLE_3 | IDTABLE_1 | IDTABLE_2 | VALUE | | 201 | 1 | 101 | a | | 202 | 1 | 102 | b | | 203 | 1 | 103 | c | | 204 | 2 | 101 | d | | 205 | 2 | 102 | e | | 206 | 2 | 103 | f | | 207 | 3 | 101 | g | | 208 | 3 | 102 | h | | 209 | 3 | 103 | i | 

Toute suggestion sur un moyen simple de le faire?

 SELECT IDENTITY(int, 200, 1) IDTABLE_3, T1.IDTABLE_1, T2.IDTABLE_2, CASE T2.COLUMN WHEN 'X' THEN T1.X WHEN 'Y' THEN T1.Y WHEN 'Z' THEN T1.Z END VALUE INTO TABLE_3 FROM TABLE_1 T1 CROSS JOIN TABLE_2 T2 

Vous pouvez utiliser l'opérateur de table UNPIVOT pour ce faire, comme ceci:

 WITH CTE AS ( SELECT IDTABLE_1, ID, value FROM Table_1 UNPIVOT ( ID FOR value IN(x, y,z) ) u ) SELECT ROW_NUMBER() OVER(ORDER BY t1.ID) + 200 AS IDTABLE_3 , t1.IDTABLE_1, t2.[IDTABLE_2], t1.ID AS VALUE FROM CTE t1 INNER JOIN TABLE_2 t2 ON t1.value = t2."Column"; 

Démo de Fiddle SQL

Cela vous donnera:

 | IDTABLE_3 | IDTABLE_1 | IDTABLE_2 | VALUE | --------------------------------------------- | 201 | 1 | 101 | a | | 202 | 1 | 102 | b | | 203 | 1 | 103 | c | | 204 | 2 | 101 | d | | 205 | 2 | 102 | e | | 206 | 2 | 103 | f | | 207 | 3 | 101 | g | | 208 | 3 | 102 | h | | 209 | 3 | 103 | i | 

Selon votre version de SQL Server, vous pouvez utiliser la fonction UNPIVOT sur la première table, appliquer un row_number() à chaque table, puis vous row_number() sur le numéro de ligne. La fonction UNPIVOT prend les colonnes X , Y et Z et les convertit en lignes. Une fois cette conversion effectuée, vous atsortingbuez à chaque logging un row_number() partitionné par IDTABLE_1 .

 select row_number() over(order by t1.IDTABLE_1) + 200 AS IDTABLE_3, t1.IDTABLE_1, t2.IDTABLE_2, t1.value from ( select IDTABLE_1, value, col, row_number() over(partition by IDTABLE_1 order by col) rn from table1 unpivot ( value for col in (X, Y, Z) ) unpiv ) t1 inner join ( select IDTABLE_2, [COLUMN], row_number() over(order by IDTABLE_2) rn from Table2 ) t2 on t1.rn = t2.rn order by t1.IDTABLE_1; 

Voir SQL Fiddle avec démo

Le résultat est:

 | IDTABLE_3 | IDTABLE_1 | IDTABLE_2 | VALUE | --------------------------------------------- | 201 | 1 | 101 | a | | 202 | 1 | 102 | b | | 203 | 1 | 103 | c | | 204 | 2 | 101 | d | | 205 | 2 | 102 | e | | 206 | 2 | 103 | f | | 207 | 3 | 101 | g | | 208 | 3 | 102 | h | | 209 | 3 | 103 | i |