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

时间:2012-07-05 08:16:35

标签: sql tsql

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

5 个答案:

答案 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或任何值。