3

我正在尝试使用插入选择从一个查询复制多条记录。

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。如何在单个查询中实现它?

4

5 回答 5

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显然特定于所述问题。


编辑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)
于 2012-07-05T08:24:19.980 回答
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)
于 2012-07-05T08:24:26.607 回答
0

您是否刚刚尝试将不想要的差异添加到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) 

注意:我错过了这部分,在你的情况下差异并不一致。仅当差异相同时,建议的解决方案才有效

于 2012-07-05T08:43:00.780 回答
0

有几个选项:

将新的 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 值。

于 2012-07-05T08:45:21.793 回答
0

您也可以在选择中写大小写。当 2 然后 23 或任何值。

于 2017-02-16T07:19:50.143 回答