Sql插入选择 - 具有唯一列ID的多行

3
我正在尝试使用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。如何在单个查询中实现?


你想要更改名称还是值? - Chetter Hummin
我想更改数值 - 用23(新行)替换2(旧行)。 - witpo
5个回答

4
这个会起作用。
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

如果您认为编辑 2实际上是您想要的,则需要将ColID设置为IDENTITY列,然后可以执行以下操作。

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

我之前使用这种方法进行单个插入操作。有没有避免使用 UNION ALL 的方法? - witpo
colId 不是标识列。 - witpo
@witpo 进行多个插入或编写一个函数来处理旧ID到新ID的转换。 - Jodrell
你能否考虑一些常规的解决方案,预知 colId(x,y,z,x)将被替换为 coldId(x1,y1,z1,x1)。列数可能会根据用户选择而改变。 - witpo
@witpo,做这件事的“正确”方式是EDIT3,但我越想,除了主键之外,复制一切的意义是什么? - Jodrell
这个例子展示了我问题的简化版本。Col1,col2...引用了其他表中的一些数据,目的是将其复制并允许用户根据需要进行修改。我希望能够更改colId并使其成为标识列,但我认为我将不得不选择edit2选项。 - witpo

0

你也可以在 select 语句中使用 case。例如:当值为 2 时,返回 23 或其他值。


1
您可能需要为那些不熟悉大小写的用户提供一个可工作的示例。 - cracked_all

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)

我想要替换一个 coldId 值。 - witpo

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) 

注意:我错过了这一部分,即在您的情况下差异不一致。

提出的解决方案仅在差异相同时有效。


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值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接