2014-11-05 113 views
0

我想使用INSERT INTO从表中复制一些行的SQL查询,但我想要一个字段(这不是主键)有一个新的,独特的,int(我知道这是可怕的数据库设计,但我不能改变数据库的结构)。插入一个唯一的int到非主键字段

这里是什么,我试图做一个简单的例子:

INSERT INTO Mytable 
     (field1 
     ,field2 
     ,field3 
     ,nonKeyUniqueInt) 

    SELECT 
     (field1 
     ,field2 
     ,field3 
     ,(SELECT MAX(nonKeyUniqueInt)+1 FROM mytable) 
    FROM 
     mytable 
    WHERE 
     (conditions) 

然而,这并不工作,因为SELECT MAX查询只运行一次,给我的所有新行了,同样的价值领域。鉴于以下行来复制:

 
field1field2field3nonKeyUniqueInt 
x  y  z  1 
a  b  c  2 

我得到的输出:

 
field1field2field3nonKeyUniqueInt 
x  y  z  1 
a  b  c  2 
x  y  z  3 
a  b  c  3 

正是我试图做可能吗?

+1

注意:'SELECT MAX(...)+ n'通常不会很好地表现出并发性。怎么样像['SEQUENCE'](http://msdn.microsoft.com/en-us/library/ff878091.aspx)?或者你不想维护一个全局对象? – 2014-11-05 13:23:51

+0

@ Clockwork-Muse你可能是对的,但它基本上是一次性的查询,我想以最简单的方式来完成。 – Slappywag 2014-11-05 14:14:10

回答

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条款作出明确表示,它是只计算一次。

+0

我认为你的SELECT中的x应该是x.maxk – 2014-11-05 13:12:50

+0

@AndyNichols。 。 。谢谢。 – 2014-11-05 13:13:55

+0

谢谢,它在我的例子中完美。但是,当我试图将它放入真正的数据库时,出现错误“Subquery返回了超过1个值”。我看不出它是如何做到的!哦,我相信我会解决它的。 – Slappywag 2014-11-05 14:10:19