2012-07-05 67 views
2

我想使用一個查詢使用插入選擇來複制多個記錄。Sql插入選擇 - 具有唯一列ID的多行

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

是否可以爲新條目分配不同的colId?例如,colid 2應該用23替換,4替換爲24,6替換爲25.我怎樣才能在單個查詢中實現它?

+0

是否要更改名稱或值? –

+0

我想更改值 - 用23(新行)替換2(舊行) – 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 

如果你給一些更多的信息,我可以提供更多的財產以後可重複使用。應該/是colId(是)標識列嗎?


編輯

這將在這個非常特殊的情況下

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

我懷疑這樣的財產以後是更通用的方法是適當的。

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 

編輯3

如果你認爲EDIT 2實際上是你真的想ColIDIDENTITY列你想那什麼,那麼你可以做到這一點。

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 - 在你的情況,因爲你需要由23來代替圖2,不同的是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是不共在你的情況下一直存在。

新的ID列添加到原始表,並用新值來填充它這樣做插入之前,選擇新: 如果不同的是相同

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) 

最後的手段 - 按順序使用遊標處理插入,每次修改ID值。

0

您也可以在select中寫入大小寫。當2然後23或任何值。

+1

您可能想要爲可能不夠流暢的用戶提供一個工作示例。 –

相關問題