给定一个有三列的表
我正在尝试编写一个SQL INSERT INTO语句,该语句将具有一个GroupID的每一行的副本复制到一个新的GroupID中。
示例开始表:
ID | GroupID | SomeValue
------------------------
1 | 1 | a
2 | 1 | b
运行简单的INSERT INTO语句后的目标:
ID | GroupID | SomeValue
------------------------
1 | 1 | a
2 | 1 | b
3 | 2 | a
4 | 2 | b
我以为我可以做类似的事情:
INSERT INTO MyTable
( [ID]
,[GroupID]
,[SomeValue]
)
(
SELECT (SELECT MAX(ID) + 1 FROM MyTable)
,@NewGroupID
,[SomeValue]
FROM MyTable
WHERE ID = @OriginalGroupID
)
这会导致PrimaryKey违规,因为它最终会多次重复使用相同的Max(ID)+1值。
我是否只能在T-SQL WHILE语句中使用一堆具有递增计数器值的INSERT语句?
我也没有将ID转换为自动递增标识列的选项,因为这会破坏我没有源代码的代码。
答案 0 :(得分:11)
而不是+ 1
,请添加行号。我还修复了WHERE子句中的错误(应该是GroupID =
,而不是ID =
):
INSERT INTO MyTable
( [ID]
,[GroupID]
,[SomeValue]
)
(
SELECT
(SELECT MAX(ID) FROM MyTable) + ROW_NUMBER() OVER (ORDER BY GroupId),
@NewGroupID,
[SomeValue]
FROM MyTable
WHERE GroupID = @OriginalGroupID
)
答案 1 :(得分:1)
WITH q AS
(
SELECT *,
(
SELECT MAX(id)
FROM mytable
) + ROW_NUMBER() OVER () AS nid
FROM mytable
WHERE groupID = 1
)
INSERT
INTO mytable (id, groupid, somevalue)
SELECT nid, 2, somevalue
FROM q
答案 2 :(得分:1)
使用此:
INSERT INTO MyTable
( [ID]
,[GroupID]
,[SomeValue]
)
SELECT ROW_NUMBER() OVER() + X.MaxID
,@NewGroupID
,[SomeValue]
FROM MyTable
CROSS JOIN (SELECT MAX(ID) AS MaxID FROM MyTable) X
WHERE GroupID = @OriginalGroupID