2013-06-28 2 views
0

Например, у меня есть первая таблица, и я хочу заполнить вторую таблицу, используя первую таблицу.Как добавить строки во вторую таблицу из первой таблицы с использованием выражения Common table в SQL Server

  Table A    
Name A B C D 
----------------------- 
name1 a1 b1 c1 d1 
name2 a2 b2 c2 d2 



     Table B (Desired Format)  
    ID Name Code 
---------------------- 
    1  name1 a1 
    2  name1 b1 
    3  name1 c1 
    4  name1 d1 
    5  name2 a2 
    6  name2 b2 
    7  name2 c2 
    8  name2 d2 

В соответствии с предложениями @Surendra Нат GM, я попробовал этот

DECLARE @counter as int 
    SET @counter = 1; 
    ;WITH Actual AS 
    (
    SELECT ROW_NUMBER() OVER(ORDER BY IDKEY) as ID FROM Northwind.dbo.Table1 
    WHERE 
    ),FIRST AS 
    (
    SELECT ((ROW_NUMBER() OVER(ORDER BY IDKEY))*4-3) AS ID,Name, A 
    FROM Northwind.dbo.Table1 

    ),SECOND AS 
    (
    SELECT ((ROW_NUMBER() OVER(ORDER BY IDKEY))*4-2) AS ID, Name ,B 
    from Northwind.dbo.Table1 
    ), NEXT AS 
    (
SELECT ((ROW_NUMBER() OVER(ORDER BY IDKEY))*4-1) AS ID, Name, C 
    from Northwind.dbo.Table1next 
), ________ as 
(
    SELECT ((ROW_NUMBER() OVER(ORDER BY IDKEY))*4) AS ID, Name, D 
from Northwind.dbo.Table1 
) 

@counter = @counter+1; 
) 
    SELECT * FROM FIRST 
    UNION ALL 
    SELECT * FROM SECOND 
    UNION ALL 
    SELECT * FROM NEXT 
    UNION ALL 
    SELECT * FROM _________ 
    ORDER BY ID 

Вот то, что я использую после "ВТОРОГО AS". Я пробовал писать «THIRD AS», но, похоже, такой команды не существует, поэтому после некоторого поиска я мог написать третью строку с помощью «NEXT AS», но я совершенно не знаю, как мне вставить четвертую строку.

Я знаю, что можно просто написать 4 команды вставки для каждого из A, B, C и D, но тогда я получить не коды в следующем порядке, который не желателен:

Table B(NOT DESIRED IN THIS FORMAT)  
    ID Name Code 
---------------------- 
    1  name1 a1 
    2  name2 a2 
    3  name1 b1 
    4  name2 b2 
    5  name1 c1 
    6  name2 c2 
    7  name1 d1 
    8  name2 d2 

Кроме того, желаемый формат может быть достигнут с помощью простых циклов, но в проекте, над которым я работаю, существует около 200000 строк, а метод простых циклов занимает много времени. Итак, я хочу сделать это с помощью CTE. Пожалуйста помоги.

+1

показать свою структуру таблицы обоих таблиц ... ?? –

ответ

0

получает идентификатор будет Хитрость здесь для того, чтобы сделать это и использовать набор opertaions, вы должны разделить работу на две и генерировать нечетные идентификаторы для выбора из A1, B1 и генерировать событие идентификаторов для выбора А2, В2

как показано ниже

;WITH Actual AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY Name) as RN, * FROM Table1 
),FIRST AS 
(
    SELECT ((RN*2)-1) AS ID,A1,B1 
    FROM TABLE1 
    ORDER BY RN 
),SECOND AS 
(
    SELECT (RN*2) AS ID,A2,B2 
    FROM TABLE1 
    ORDER BY RN 
) 
SELECT * FROM FIRST 
UNION ALL 
SELECT * FROM SECOND 

, если у вас есть четыре столбца, то вы можете использовать ниже Que ry вместо

;WITH Actual AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY Name) as RN, * FROM Table1 
),FIRST AS 
(
    SELECT ((RN*2)-1) AS ID,A1,B1,C1,D1 
    FROM TABLE1 
    ORDER BY RN 
),SECOND AS 
(
    SELECT (RN*2) AS ID,A2,B2,C2,D2 
    FROM TABLE1 
    ORDER BY RN 
) 
SELECT * FROM FIRST 
UNION ALL 
SELECT * FROM SECOND 
+0

Спасибо за ответ ... это работает для двух столбцов. Но проект, над которым я работаю, имеет 4 столбца. Итак, что я использую после «SECOND AS». Я пробовал писать «THIRD AS», но, похоже, такой команды не существует, поэтому после некоторого поиска я мог написать третью строку с помощью «NEXT AS», но я совершенно не знаю, как мне вставить четвертую строку. – ni9e

+0

@nie 4 столбца, вы имеете в виду вы A1, B1, A2, B2, A3, B3? вы можете указать ту же схему таблиц, что и выше, что позволит нам лучше помочь – Surendra

+0

По 4 столбцам я имею в виду, что в таблице 1 будет 8 столбцов, то есть A1, A2, B1, B2, C1, C2, D1, D2, которые будет соответствовать 4 столбцам (A, B, C, D) в таблице 2. – ni9e

1

Вы можете сделать это с двумя вставками:

insert into tableB(A, B) 
    select A1, B1 
    from tableA; 

insert into tableB(A, B) 
    select A2, B2 
    from tableA; 

Или объединение таблицы с одной вставкой:

insert into tableB(A, B) 
    select A1, B1 
    from tableA union all 
    select A2, B2 
    from tableA; 

Это предполагает, что id определяется как id int indentity(1, 1), поэтому он автоматически увеличивает.

Если нет, то вы можете назначить его как:

insert into tableB(id, A, B) 
    select row_number() over (order by (select NULL)) as id, A1, B1 
    from (select A1, B1 
      from tableA union all 
      select A2, B2 
      from tableA 
     ) t 
+0

Мне нужен ответ, чтобы A1 и A2 каждой строки были вместе (как показано в таблице 2), т. Е. Если бы я должен был добавить четвертый столбец в таблицу 2 с заголовком «Имя», тогда первые две строки будут иметь « ABD "в них. Прошу прощения, я должен был уточнить это в вопросе. В любом случае, спасибо за ответ. – ni9e

Смежные вопросы