2012-07-05 5 views
2

Я пытаюсь скопировать несколько записей, используя один запрос, используя insert.Sql insert select from - несколько строк с уникальным идентификатором столбца

Insert into tab_A(colId, col1, col2, col3) 
Select colId, col1, col2, col3 form tab_A 
Where colId in (2,4,6) 

Можно ли назначить разные значения для новых записей? Например, colid 2 следует заменить на 23, 4 с 24 и 6 на 25. Как я могу достичь этого в одном запросе?

+0

Вы хотите изменить имена или значения? –

+0

Я хотел бы изменить значения - заменить 2 (старую строку) на 23 (новая строка) – witpo

ответ

3

это будет работать

Insert into tab_A(colId, col1, col2, col3) 
Select 23 , col1, col2, col3 form tab_A Where colId = 2 UNION ALL 
Select 24 , col1, col2, col3 form tab_A Where colId = 4 UNION ALL 
Select 25 , col1, col2, col3 form tab_A Where colId = 6 

Если вы дать некоторую информацию я могла бы обеспечить Somthing более многоразовые. Должен/есть colId (be) столбец идентичности?


EDIT

Это будет работать в этом узкоспециализированных случае

Insert into tab_A(colId, col1, col2, col3) 
Select ((colId - 4) * (-1)) + colId + 20 , col1, col2, col3 
    form tab_A Where colId IN (2, 4, 6) 

Функция newId = ((oldId - 4) * (-1)) + oldId + 20 явно специфичны для поставленной задачи.


EDIT2

Я подозреваю Somthing как это более общий подход является целесообразным.

DECLARE @MaxColID INT 

BEGIN TRANSACTION 

SELECT @MaxColID = MAX(ColID) FROM tab_A 

INSERT tab_A(colId, col1, col2, col3) 
SELECT row + @MaxColID, col1, col2, col3 
    FROM 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY ColID) row, col1, col2, col3 
     FROM tab_A WHERE colID IN (2, 4, 6) 
    ) 

COMMIT 

EDIT 3

Если вы думаете EDIT 2 на самом деле то, что вы хотите, то вы действительно хотите сделать ColID в IDENTITY колонку, то вы могли бы сделать это.

INSERT tab_A (col1, col2, col3) 
SELECT col1, col2, col3 FROM tab_A WHERE colId IN (2, 4, 6) 
+0

Я использовал этот подход с одной вставкой. Есть ли способ избежать объединения всех? – witpo

+0

colId не является личным адресом – witpo

+0

@witpo Сделайте несколько вставок или создайте функцию для oldID для newID. – Jodrell

0

Я не вижу COL4 или col6 в запросе, но это то, что вы хотите:

Insert into tab_A(colId, col1, col2, col3) 
Select colId, col1, 23, col3 form tab_A 
Where colId in (2,4,6) 
+0

Я бы хотел заменить значение coldId – witpo

0

ты просто попытался добавить disired разницу colId - В вашем случае, так как вам нужно заменить 2 на 23, разница составляет 21.

Insert into tab_A(colId, col1, col2, col3) 
Select colId+21, col1, col2, col3 
form tab_A Where colId in (2,4,6) 

Примечание: Я пропустил часть, что differnce не со в вашем случае. Предлагаемое решение будет работать только тогда, когда разница в том же

0

Есть несколько вариантов:

Добавить новый столбец ID для исходной таблицы и заполнить его с новыми значениями, прежде чем это сделать вставку, выбирая новую ID вместо старого. Думаю, это было бы самым изысканным решением.

Альтернатива - изменение значения идентификатора вставки на основе правила, например.

INSERT INTO tab_A(colID, col1, col2, col3) 
SELECT colId + 20, col1, col2, col3 
FROM tab_A 
WHERE colID IN(2,4,6) 

Последнее применение - обрабатывать вставку последовательно курсором, изменяя значение идентификатора каждый раз.

0

Вы также можете записать регистр в списке. когда 2 затем 23 или любое другое значение.

+1

Вы можете захотеть обеспечить рабочий пример для пользователей, которые не могут свободно говорить о делах. –

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