我正在尝试使用INSERT INTO进行SQL查询以从表中复制多个行,但我希望其中一个字段(不是主键)具有新的唯一int(我知道这是一个糟糕的数据库设计,但我无法改变数据库的结构。)
以下是我正在尝试做的简化示例:
INSERT INTO Mytable
(field1
,field2
,field3
,nonKeyUniqueInt)
SELECT
(field1
,field2
,field3
,(SELECT MAX(nonKeyUniqueInt)+1 FROM mytable)
FROM
mytable
WHERE
(conditions)
但是这不起作用,因为SELECT MAX查询只运行一次,为我的所有新行提供该字段的相同值。给定以下要复制的行:
field1 field2 field3 nonKeyUniqueInt x y z 1 a b c 2
我得到的输出:
field1 field2 field3 nonKeyUniqueInt x y z 1 a b c 2 x y z 3 a b c 3
我正在尝试做什么?
答案 0 :(得分:2)
问题是子查询对insert
进行一次评估,而不是每行评估一次。解决方案是使用row_number()
:
INSERT INTO Mytable(field1, field2, field3, nonKeyUniqueInt)
SELECT field1, field2, field3,
x.maxk + row_number() over (order by (select NULL))
FROM mytable CROSS JOIN
(SELECT MAX(nonKeyUniqueInt) as maxk FROM mytable) x
WHERE (conditions);
我将最大计算移动到FROM
子句,以明确它只被评估一次。