我正在尝试使用插入选择从一个查询复制多条记录。
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。如何在单个查询中实现它?
这会工作
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
显然特定于所述问题。
编辑2
我怀疑像这样更通用的方法是合适的。
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实际上是您想要的,那么您真的想要创建ColID
一个IDENTITY
专栏,那么您可以这样做。
INSERT tab_A (col1, col2, col3)
SELECT col1, col2, col3 FROM tab_A WHERE colId IN (2, 4, 6)
我在您的查询中没有看到 col4 或 col6,但这是您想要的:
Insert into tab_A(colId, col1, col2, col3)
Select colId, col1, 23, col3 form tab_A
Where colId in ( 2,4,6)
您是否刚刚尝试将不想要的差异添加到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)
注意:我错过了这部分,在你的情况下差异并不一致。仅当差异相同时,建议的解决方案才有效
有几个选项:
将新的 ID 列添加到原始表并在执行此插入之前用新值填充它,选择新的 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 值。
您也可以在选择中写大小写。当 2 然后 23 或任何值。