我正在尝试使用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?例如,colid 2应该用23,4替换为24和6替换为25.如何在单个查询中实现它?
答案 0 :(得分: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 实际上是您想要的,那么您真的想让ColID
成为IDENTITY
列,那么您可以这样做。
INSERT tab_A (col1, col2, col3)
SELECT col1, col2, col3 FROM tab_A WHERE colId IN (2, 4, 6)
答案 1 :(得分: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)
答案 2 :(得分:0)
您刚刚尝试将令人厌恶的差异添加到colId
-
在您的情况下,由于您需要将23替换为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)
注意:我错过了这个部分,在您的情况下差异不一致。 只有差异相同时,建议的解决方案才有效
答案 3 :(得分:0)
有几个选择:
将新ID列添加到原始表中,并在执行此插入之前使用新值填充它,选择新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值。
答案 4 :(得分:0)
您也可以在选择中编写案例。当2或23或任何值。